PERFORCE change 124529 for review

Jung-uk Kim jkim at FreeBSD.org
Thu Aug 2 11:15:08 PDT 2007


On Thursday 02 August 2007 07:30 am, Roman Divacky wrote:
> +
> +/* XXX: fake one.. waiting for ssouhlal to commit his patch */
> +int
> +linux_sched_getaffinity(struct thread *td, struct
> linux_sched_getaffinity_args *args) +{
> +	int error;
> +	cpumask_t i = ~0;
> +
> +	if (args->len < sizeof(cpumask_t))
> +		return (EINVAL);
> +
> +	error = copyout(&i, args->user_mask_ptr, sizeof(cpumask_t));
> +	return (error);
> +}

Er, shouldn't it be more like this?

int
linux_sched_getaffinity(struct thread *td,
	struct linux_sched_getaffinity_args *args)
{
	uint8_t	*mask;
	int	error;

	if (args->cpusetsize < sizeof(cpumask_t))
		return (EINVAL);

	mask = malloc(args->cpusetsize, M_LINUX, M_WAITOK);
	memset(mask, 0xff, args->cpusetsize);
	error = copyout(mask, args->mask, args->cpusetsize);
	free(mask, M_LINUX);

	return (error);
}

The reason is because Linux can ask longer CPU mask than FreeBSD's.
The (old) default used to be 1024-bit (128-byte) mask.  So, a lot
of Linux apps still do that.

Also, can you match args to the Linux API?

int sched_getaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask);

s/len/cpusetsize/
s/user_mask_ptr/mask/

Thanks,

Jung-uk Kim


More information about the p4-projects mailing list