Print this page
patch tsoome-feedback


 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 }