1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _CMA_H
#define _CMA_H
#include <fm/fmd_api.h>
#include <sys/types.h>
#ifdef __cplusplus
extern "C" {
#endif
#define CMA_RA_SUCCESS 0
#define CMA_RA_FAILURE 1
#ifdef opl
#define FM_FMRI_HC_CPUIDS "hc-xscf-cpuids"
#endif
#ifdef i386
extern boolean_t cma_is_native;
#endif
typedef struct cma_page {
struct cma_page *pg_next; /* List of page retirements for retry */
nvlist_t *pg_rsrc; /* Resource for this page */
nvlist_t *pg_asru; /* ASRU for this page */
uint64_t pg_addr; /* Address of this page */
char *pg_uuid; /* UUID for this page's case */
uint_t pg_nretries; /* Number of retries so far for page */
} cma_page_t;
#ifdef sun4v
typedef struct cma_cpu {
struct cma_cpu *cpu_next; /* List of cpus */
nvlist_t *cpu_fmri; /* FMRI for this cpu entry */
int cpuid; /* physical id of this cpu */
char *cpu_uuid; /* UUID for this cpu's case */
uint_t cpu_nretries; /* Number of retries so far for cpu */
} cma_cpu_t;
#endif /* sun4v */
typedef struct cma {
struct timespec cma_cpu_delay; /* CPU offline retry interval */
uint_t cma_cpu_tries; /* Number of CPU offline retries */
uint_t cma_cpu_dooffline; /* Whether to offline CPUs */
uint_t cma_cpu_forcedoffline; /* Whether to do forced CPU offline */
uint_t cma_cpu_doonline; /* Whether to online CPUs */
uint_t cma_cpu_doblacklist; /* Whether to blacklist CPUs */
uint_t cma_cpu_dounblacklist; /* Whether to unblacklist CPUs */
cma_page_t *cma_pages; /* List of page retirements for retry */
hrtime_t cma_page_curdelay; /* Current retry sleep interval */
hrtime_t cma_page_mindelay; /* Minimum retry sleep interval */
hrtime_t cma_page_maxdelay; /* Maximum retry sleep interval */
id_t cma_page_timerid; /* fmd timer ID for retry sleep */
uint_t cma_page_doretire; /* Whether to retire pages */
uint_t cma_page_dounretire; /* Whether to unretire pages */
#ifdef sun4v
cma_cpu_t *cma_cpus; /* List of cpus */
hrtime_t cma_cpu_curdelay; /* Current retry sleep interval */
hrtime_t cma_cpu_mindelay; /* Minimum retry sleep interval */
hrtime_t cma_cpu_maxdelay; /* Maximum retry sleep interval */
id_t cma_cpu_timerid; /* LDOM cpu timer */
#endif /* sun4v */
} cma_t;
typedef struct cma_stats {
fmd_stat_t cpu_flts; /* Successful offlines */
fmd_stat_t cpu_repairs; /* Successful onlines */
fmd_stat_t cpu_fails; /* Failed offlines/onlines */
fmd_stat_t cpu_blfails; /* Failed blacklists */
fmd_stat_t cpu_supp; /* Suppressed offlines/onlines */
fmd_stat_t cpu_blsupp; /* Suppressed blacklists */
fmd_stat_t page_flts; /* Successful page retires */
fmd_stat_t page_repairs; /* Successful page unretires */
fmd_stat_t page_fails; /* Failed page retires/unretires */
fmd_stat_t page_supp; /* Suppressed retires/unretires */
fmd_stat_t page_nonent; /* Retires for non-present pages */
fmd_stat_t bad_flts; /* Malformed faults */
fmd_stat_t nop_flts; /* Inapplicable faults */
fmd_stat_t auto_flts; /* Auto-close faults */
} cma_stats_t;
extern cma_stats_t cma_stats;
extern cma_t cma;
extern int cma_cpu_cpu_retire(fmd_hdl_t *, nvlist_t *, nvlist_t *,
const char *, boolean_t);
extern int cma_cpu_hc_retire(fmd_hdl_t *, nvlist_t *, nvlist_t *,
const char *, boolean_t);
extern int cma_page_retire(fmd_hdl_t *, nvlist_t *, nvlist_t *,
const char *, boolean_t);
extern void cma_page_retry(fmd_hdl_t *);
extern void cma_page_fini(fmd_hdl_t *);
extern int cma_set_errno(int);
extern int cma_cache_way_retire(fmd_hdl_t *, nvlist_t *, nvlist_t *,
const char *, boolean_t);
/*
* Platforms may have their own implementations of these functions
*/
extern int cma_cpu_blacklist(fmd_hdl_t *, nvlist_t *, nvlist_t *, boolean_t);
extern int cma_cpu_statechange(fmd_hdl_t *, nvlist_t *, const char *, int,
boolean_t);
extern int cma_fmri_page_service_state(fmd_hdl_t *, nvlist_t *);
extern int cma_fmri_page_retire(fmd_hdl_t *, nvlist_t *);
extern int cma_fmri_page_unretire(fmd_hdl_t *, nvlist_t *);
#ifdef sun4v
extern void cma_cpu_start_retry(fmd_hdl_t *, nvlist_t *, const char *,
boolean_t);
extern void cma_cpu_fini(fmd_hdl_t *);
extern void cma_cpu_retry(fmd_hdl_t *);
#endif /* sun4v */
extern const char *p_online_state_fmt(int);
#ifdef __cplusplus
}
#endif
#endif /* _CMA_H */
|