Exemplo n.º 1
0
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));
	}
}
Exemplo n.º 2
0
/**
 * 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
}
Exemplo n.º 3
0
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);
}