示例#1
0
/*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);
}
示例#2
0
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 */
    }
}