254 FM_FMRI_HC_SERIAL_ID, &sn) != 0)
255 return (1);
256
257 /*
258 * get asru in mem scheme from topology
259 */
260 asru = gmem_find_dimm_asru(hdl, sn);
261 if (asru == NULL)
262 return (1);
263
264 (void) nvlist_add_string_array(asru, FM_FMRI_MEM_SERIAL_ID, &sn, 1);
265 (void) nvlist_add_uint64(asru, FM_FMRI_MEM_PHYSADDR,
266 page->page_physbase);
267 (void) nvlist_add_uint64(asru, FM_FMRI_MEM_OFFSET, page->page_offset);
268
269 if (fmd_nvl_fmri_unusable(hdl, asru)) {
270 nvlist_free(asru);
271 return (1);
272 }
273
274 if (asru != NULL)
275 nvlist_free(asru);
276
277 return (0);
278 }
279
280
281 /*ARGSUSED*/
282 void
283 gmem_page_validate(fmd_hdl_t *hdl)
284 {
285 gmem_page_t *page, *next;
286
287 for (page = gmem_list_next(&gmem.gm_pages); page != NULL; page = next) {
288 next = gmem_list_next(page);
289
290 if (gmem_page_unusable(hdl, page))
291 gmem_page_destroy(hdl, page);
292 }
293 }
294
309 {
310 gmem_page_t *page;
311
312 while ((page = gmem_list_next(&gmem.gm_pages)) != NULL)
313 gmem_page_free(hdl, page, FMD_B_FALSE);
314 }
315
316
317 int
318 gmem_page_fault(fmd_hdl_t *hdl, nvlist_t *fru, nvlist_t *rsc,
319 fmd_event_t *ep, uint64_t afar, uint64_t offset)
320 {
321 gmem_page_t *page = NULL;
322 const char *uuid;
323 nvlist_t *flt, *hsp;
324
325 page = gmem_page_lookup(afar);
326 if (page != NULL) {
327 if (page->page_flags & GMEM_F_FAULTING ||
328 gmem_page_unusable(hdl, page)) {
329 if (rsc != NULL)
330 nvlist_free(rsc);
331 page->page_flags |= GMEM_F_FAULTING;
332 return (0);
333 }
334 } else {
335 page = gmem_page_create(hdl, fru, afar, offset);
336 }
337
338 page->page_flags |= GMEM_F_FAULTING;
339 if (page->page_case.cc_cp == NULL)
340 page->page_case.cc_cp = gmem_case_create(hdl,
341 &page->page_header, GMEM_PTR_PAGE_CASE, &uuid);
342
343 if (nvlist_lookup_nvlist(page->page_asru_nvl, FM_FMRI_HC_SPECIFIC,
344 &hsp) == 0)
345 (void) nvlist_add_nvlist(rsc, FM_FMRI_HC_SPECIFIC, hsp);
346
347 flt = fmd_nvl_create_fault(hdl, GMEM_FAULT_PAGE, 100, NULL, fru, rsc);
348 if (rsc != NULL)
349 nvlist_free(rsc);
350
351 if (nvlist_add_boolean_value(flt, FM_SUSPECT_MESSAGE, B_FALSE) != 0)
352 fmd_hdl_abort(hdl, "failed to add no-message member to fault");
353
354 fmd_case_add_ereport(hdl, page->page_case.cc_cp, ep);
355 fmd_case_add_suspect(hdl, page->page_case.cc_cp, flt);
356 fmd_case_solve(hdl, page->page_case.cc_cp);
357 return (1);
358 }
359
360 void
361 gmem_page_close(fmd_hdl_t *hdl, void *arg)
362 {
363 gmem_page_destroy(hdl, arg);
364 }
|
254 FM_FMRI_HC_SERIAL_ID, &sn) != 0)
255 return (1);
256
257 /*
258 * get asru in mem scheme from topology
259 */
260 asru = gmem_find_dimm_asru(hdl, sn);
261 if (asru == NULL)
262 return (1);
263
264 (void) nvlist_add_string_array(asru, FM_FMRI_MEM_SERIAL_ID, &sn, 1);
265 (void) nvlist_add_uint64(asru, FM_FMRI_MEM_PHYSADDR,
266 page->page_physbase);
267 (void) nvlist_add_uint64(asru, FM_FMRI_MEM_OFFSET, page->page_offset);
268
269 if (fmd_nvl_fmri_unusable(hdl, asru)) {
270 nvlist_free(asru);
271 return (1);
272 }
273
274 nvlist_free(asru);
275
276 return (0);
277 }
278
279
280 /*ARGSUSED*/
281 void
282 gmem_page_validate(fmd_hdl_t *hdl)
283 {
284 gmem_page_t *page, *next;
285
286 for (page = gmem_list_next(&gmem.gm_pages); page != NULL; page = next) {
287 next = gmem_list_next(page);
288
289 if (gmem_page_unusable(hdl, page))
290 gmem_page_destroy(hdl, page);
291 }
292 }
293
308 {
309 gmem_page_t *page;
310
311 while ((page = gmem_list_next(&gmem.gm_pages)) != NULL)
312 gmem_page_free(hdl, page, FMD_B_FALSE);
313 }
314
315
316 int
317 gmem_page_fault(fmd_hdl_t *hdl, nvlist_t *fru, nvlist_t *rsc,
318 fmd_event_t *ep, uint64_t afar, uint64_t offset)
319 {
320 gmem_page_t *page = NULL;
321 const char *uuid;
322 nvlist_t *flt, *hsp;
323
324 page = gmem_page_lookup(afar);
325 if (page != NULL) {
326 if (page->page_flags & GMEM_F_FAULTING ||
327 gmem_page_unusable(hdl, page)) {
328 nvlist_free(rsc);
329 page->page_flags |= GMEM_F_FAULTING;
330 return (0);
331 }
332 } else {
333 page = gmem_page_create(hdl, fru, afar, offset);
334 }
335
336 page->page_flags |= GMEM_F_FAULTING;
337 if (page->page_case.cc_cp == NULL)
338 page->page_case.cc_cp = gmem_case_create(hdl,
339 &page->page_header, GMEM_PTR_PAGE_CASE, &uuid);
340
341 if (nvlist_lookup_nvlist(page->page_asru_nvl, FM_FMRI_HC_SPECIFIC,
342 &hsp) == 0)
343 (void) nvlist_add_nvlist(rsc, FM_FMRI_HC_SPECIFIC, hsp);
344
345 flt = fmd_nvl_create_fault(hdl, GMEM_FAULT_PAGE, 100, NULL, fru, rsc);
346 nvlist_free(rsc);
347
348 if (nvlist_add_boolean_value(flt, FM_SUSPECT_MESSAGE, B_FALSE) != 0)
349 fmd_hdl_abort(hdl, "failed to add no-message member to fault");
350
351 fmd_case_add_ereport(hdl, page->page_case.cc_cp, ep);
352 fmd_case_add_suspect(hdl, page->page_case.cc_cp, flt);
353 fmd_case_solve(hdl, page->page_case.cc_cp);
354 return (1);
355 }
356
357 void
358 gmem_page_close(fmd_hdl_t *hdl, void *arg)
359 {
360 gmem_page_destroy(hdl, arg);
361 }
|