/*ARGSUSED*/ static int cpu_cmd(fmd_hdl_t *hdl, nvlist_t *fmri, int cmd) { int rc = 0; char *scheme; /* * We're using topo retire if the fmri is in "hc" scheme. */ if (nvlist_lookup_string(fmri, FM_FMRI_SCHEME, &scheme) == 0 && strcmp(scheme, FM_FMRI_SCHEME_HC) == 0) { if (cmd != P_STATUS) { errno = EINVAL; return (-1); } rc = fmd_nvl_fmri_service_state(hdl, fmri); switch (rc) { case FMD_SERVICE_STATE_UNUSABLE: return (P_FAULTED); case -1: return (-1); default: return (P_ONLINE); } } switch (cmd & ~P_FORCED) { case P_STATUS: rc = ldom_fmri_status(cma_lhp, fmri); break; case P_FAULTED: rc = ldom_fmri_retire(cma_lhp, fmri); break; case P_ONLINE: rc = ldom_fmri_unretire(cma_lhp, fmri); break; default: errno = EINVAL; return (-1); } if (rc != P_OFFLINE && rc != P_ONLINE && rc != P_FAULTED) { errno = rc; return (-1); } return (rc); }
static int page_retry(fmd_hdl_t *hdl, cma_page_t *page) { int rc; if (page->pg_asru != NULL && !fmd_nvl_fmri_present(hdl, page->pg_asru)) { fmd_hdl_debug(hdl, "page retire overtaken by events"); cma_stats.page_nonent.fmds_value.ui64++; if (page->pg_uuid != NULL) fmd_case_uuclose(hdl, page->pg_uuid); return (1); /* no longer a page to retire */ } if (page->pg_rsrc == NULL || (rc = fmd_nvl_fmri_service_state(hdl, page->pg_rsrc)) < 0) rc = cma_fmri_page_service_state(hdl, page->pg_asru); if (rc == FMD_SERVICE_STATE_UNUSABLE) { fmd_hdl_debug(hdl, "retired page 0x%llx on retry %u\n", page->pg_addr, page->pg_nretries); cma_stats.page_flts.fmds_value.ui64++; if (page->pg_uuid != NULL) fmd_case_uuclose(hdl, page->pg_uuid); return (1); /* page retired */ } if (rc == FMD_SERVICE_STATE_ISOLATE_PENDING) { fmd_hdl_debug(hdl, "scheduling another retry for 0x%llx\n", page->pg_addr); return (0); /* schedule another retry */ } else { fmd_hdl_debug(hdl, "failed to retry page 0x%llx " "retirement: %s\n", page->pg_addr, strerror(errno)); cma_stats.page_fails.fmds_value.ui64++; return (1); /* give up */ } }