static int pset(int subcode, long arg1, long arg2, long arg3, long arg4) { switch (subcode) { case PSET_CREATE: return (pset_create((psetid_t *)arg1)); case PSET_DESTROY: return (pset_destroy((psetid_t)arg1)); case PSET_ASSIGN: return (pset_assign((psetid_t)arg1, (processorid_t)arg2, (psetid_t *)arg3, 0)); case PSET_INFO: return (pset_info((psetid_t)arg1, (int *)arg2, (uint_t *)arg3, (processorid_t *)arg4)); case PSET_BIND: return (pset_bind((psetid_t)arg1, (idtype_t)arg2, (id_t)arg3, (psetid_t *)arg4)); case PSET_GETLOADAVG: return (pset_getloadavg((psetid_t)arg1, (int *)arg2, (int)arg3)); case PSET_LIST: return (pset_list((psetid_t *)arg1, (uint_t *)arg2)); case PSET_SETATTR: return (pset_setattr((psetid_t)arg1, (uint_t)arg2)); case PSET_GETATTR: return (pset_getattr((psetid_t)arg1, (uint_t *)arg2)); case PSET_ASSIGN_FORCED: return (pset_assign((psetid_t)arg1, (processorid_t)arg2, (psetid_t *)arg3, 1)); default: return (set_errno(EINVAL)); } }
/** * Count CPUs. * @return number of available (logical) CPUs. */ unsigned vlc_GetCPUCount(void) { #if defined(HAVE_SCHED_GETAFFINITY) cpu_set_t cpu; CPU_ZERO(&cpu); if (sched_getaffinity (0, sizeof (cpu), &cpu) < 0) return 1; return CPU_COUNT (&cpu); #elif defined(__SunOS) unsigned count = 0; int type; u_int numcpus; processor_info_t cpuinfo; processorid_t *cpulist = malloc (sizeof (*cpulist) * sysconf(_SC_NPROCESSORS_MAX)); if (unlikely(cpulist == NULL)) return 1; if (pset_info(PS_MYID, &type, &numcpus, cpulist) == 0) { for (u_int i = 0; i < numcpus; i++) if (processor_info (cpulist[i], &cpuinfo) == 0) count += (cpuinfo.pi_state == P_ONLINE); } else count = sysconf (_SC_NPROCESSORS_ONLN); free (cpulist); return count ? count : 1; #elif defined(_SC_NPROCESSORS_CONF) return sysconf(_SC_NPROCESSORS_CONF); #else # warning "vlc_GetCPUCount is not implemented for your platform" return 1; #endif }
static int pool_check_pset(pool_conf_t *conf, pool_resource_t *res, processorid_t *del_cpus, char **errorp) { int64_t tmp; int i, j; uint_t num_cpus; uint64_t min_cpus; uint_t num_found = 0; processorid_t *cpulist; psetid_t psetid; pool_value_t *pval; pool_elem_t *elem = pool_resource_to_elem(conf, res); if ((pval = pool_value_alloc()) == NULL) return (-1); if (pool_get_property(conf, elem, "pset.min", pval) != POC_UINT) { rcm_log_message(RCM_ERROR, gettext("POOL: cannot find property 'pset.min' in pset\n")); pool_value_free(pval); return (-1); } (void) pool_value_get_uint64(pval, &min_cpus); if (pool_get_property(conf, elem, "pset.sys_id", pval) != POC_INT) { rcm_log_message(RCM_ERROR, gettext("POOL: cannot get pset.sys_id\n")); pool_value_free(pval); return (-1); } (void) pool_value_get_int64(pval, &tmp); pool_value_free(pval); psetid = (psetid_t)tmp; rcm_log_message(RCM_TRACE1, "POOL: checking pset: %d\n", psetid); rcm_log_message(RCM_TRACE1, "POOL: min_cpus is %llu\n", min_cpus); if (pset_info(psetid, NULL, &num_cpus, NULL) != 0) { rcm_log_message(RCM_ERROR, gettext("POOL: pset_info(%d) failed: %s\n"), psetid, strerror(errno)); return (-1); } if ((cpulist = malloc(num_cpus * sizeof (processorid_t))) == NULL) { rcm_log_message(RCM_ERROR, gettext("POOL: malloc failed: %s\n"), strerror(errno)); return (-1); } if (pset_info(psetid, NULL, &num_cpus, cpulist) != 0) { free(cpulist); rcm_log_message(RCM_ERROR, gettext("POOL: pset_info(%d) failed: %s\n"), psetid, strerror(errno)); return (-1); } for (i = 0; del_cpus[i] != -1; i++) for (j = 0; j < num_cpus; j++) if (cpulist[j] == del_cpus[i]) num_found++; free(cpulist); if (num_found > 0 && (num_cpus - num_found) < (uint_t)min_cpus) { int len; char *errval; const char *errfmt = gettext("POOL: processor set (%1$d) would go " "below its minimum value of %2$u\n"); /* * We would go below the min value. Fail this request. */ len = strlen(errfmt) + 4 * 2; /* 4 digits for psetid and min */ if ((errval = malloc((len + 1) * sizeof (char))) != NULL) { (void) snprintf(errval, len + 1, errfmt, psetid, (uint_t)min_cpus); *errorp = errval; } rcm_log_message(RCM_ERROR, (char *)errfmt, psetid, (uint_t)min_cpus); return (-1); } rcm_log_message(RCM_TRACE1, "POOL: pset %d is fine\n", psetid); return (0); }