Re: [PATCH] cpumask 5/10 rewrite cpumask.h - single bitmap based implementation

Mikael Pettersson
2004-06-04T09:50:41Z

William Lee Irwin III writes:
> On Fri, Jun 04, 2004 at 11:31:24AM +0200, Mikael Pettersson wrote:
> > Please don't. cpus_addr() is useful when you need to get a
> > handle on the representation for non-cpumask_t operations.
> > Case in point: the perfctr kernel extension needs to communicate
> > a cpumask_t to user-space because of the asymmetric nature of
> > HT P4s. Unfortunately, a simple copy_to_user() won't work because:
> > a) the size depends on kernel .config, and
> > b) the representation is defined in terms of sequences of ulong,
> > which breaks 32-bit applications on 64-bit kernels.
> > So perfctr instead converts a cpumask_t to a sequence of uint,
> > and copies both the number of uints and the uints themselves
> > to user-space.
> > Having to do this conversion with a for-each-CPU type loop would
> > be slow and ugly, and would IMO show that the cpumask_t ADT had
> > become an obstacle to the actual work that needs to be done.
> > So please keep cpus_addr().
>
> If the marshalling code presents different formats to userspace
> depending on BITS_PER_LONG then it's buggy.

No. Read what I wrote: binary compatibility was the very problem I
set out to solve, not cause.

For a given cpumask_t value, user-space sees the same binary
representation irregardless of how you combine 32 or 64-bit
user-spaces with 32 or 64-bit kernels.

This has all been worked out on x86 and amd64, and the conversion
is endian-neutral so e.g. ppc32 on ppc64 should work.