static int cpu_retry(fmd_hdl_t *hdl, cma_cpu_t *cpu) { int rc = 0; fmd_hdl_debug(hdl, "cpu_retry()\n"); if (cpu->cpu_fmri == NULL) { return (1); } if (!fmd_nvl_fmri_present(hdl, cpu->cpu_fmri)) { fmd_hdl_debug(hdl, "cpu %u is not present", cpu->cpuid); return (1); } rc = cpu_cmd(hdl, cpu->cpu_fmri, P_STATUS); if (rc == P_FAULTED || rc == P_OFFLINE) { fmd_hdl_debug(hdl, "cpu %u is offlined on retry %u\n", cpu->cpuid, cpu->cpu_nretries); cma_stats.cpu_flts.fmds_value.ui64++; if (cpu->cpu_uuid != NULL) fmd_case_uuclose(hdl, cpu->cpu_uuid); return (1); /* success */ } if (rc == -1) { fmd_hdl_debug(hdl, "failed to retry cpu %u\n", cpu->cpuid); cma_stats.page_fails.fmds_value.ui64++; return (1); /* give up */ } return (0); }
int cpu_offline(fmd_hdl_t *hdl, nvlist_t *asru, const char *uuid, int cpustate) { int i; uint_t cpuid; cma_cpu_t *cpu; if (nvlist_lookup_uint32(asru, FM_FMRI_CPU_ID, &cpuid) != 0) { fmd_hdl_debug(hdl, "missing '%s'\n", FM_FMRI_CPU_ID); cma_stats.bad_flts.fmds_value.ui64++; return (CMA_RA_FAILURE); } /* * cpu offlining using ldom_fmri_retire() may be asynchronous, so we * have to set the timer and check the cpu status later. */ for (i = 0; i < cma.cma_cpu_tries; i++, (void) nanosleep(&cma.cma_cpu_delay, NULL)) { if (cpu_cmd(hdl, asru, cpustate) != -1) { cma_stats.cpu_flts.fmds_value.ui64++; break; } } if (i >= cma.cma_cpu_tries) { cma_stats.cpu_fails.fmds_value.ui64++; } /* * check to see if the cpu has been offline. */ fmd_hdl_debug(hdl, "cpu is not offline yet - sleeping\n"); /* * Create a cpu node and add to the head of the cpu list */ cpu = fmd_hdl_zalloc(hdl, sizeof (cma_cpu_t), FMD_SLEEP); (void) nvlist_dup(asru, &cpu->cpu_fmri, 0); if (uuid != NULL) cpu->cpu_uuid = fmd_hdl_strdup(hdl, uuid, FMD_SLEEP); cpu->cpuid = cpuid; cpu->cpu_next = cma.cma_cpus; cma.cma_cpus = cpu; if (cma.cma_cpu_timerid != 0) fmd_timer_remove(hdl, cma.cma_cpu_timerid); cma.cma_cpu_curdelay = cma.cma_cpu_mindelay; cma.cma_cpu_timerid = fmd_timer_install(hdl, NULL, NULL, cma.cma_cpu_curdelay); return (CMA_RA_FAILURE); }
int cma_cpu_statechange(fmd_hdl_t *hdl, nvlist_t *asru, const char *uuid, int cpustate, boolean_t repair) { int i; uint_t cpuid; if (nvlist_lookup_uint32(asru, FM_FMRI_CPU_ID, &cpuid) != 0) { fmd_hdl_debug(hdl, "missing '%s'\n", FM_FMRI_CPU_ID); cma_stats.bad_flts.fmds_value.ui64++; return (CMA_RA_FAILURE); } /* * cpu offlining using ldom_fmri_retire() may be asynchronous, so we * have to set the timer and check the cpu status later. */ for (i = 0; i < cma.cma_cpu_tries; i++, (void) nanosleep(&cma.cma_cpu_delay, NULL)) { if (cpu_cmd(hdl, asru, cpustate) != -1) { if (repair) cma_stats.cpu_repairs.fmds_value.ui64++; else cma_stats.cpu_flts.fmds_value.ui64++; break; } } if (i >= cma.cma_cpu_tries) { cma_stats.cpu_fails.fmds_value.ui64++; } cma_cpu_start_retry(hdl, asru, uuid, repair); return (CMA_RA_FAILURE); }