lkml.org 
[lkml]   [2006]   [Feb]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: sys_mmap2 on different architectures
Paul Mackerras wrote:
>
>>I've looked through the code for sys_mmap2 on several architectures, and
>>it looks like some architectures plays by the "shift is always 12" rule,
>> e.g. SPARC, and some expect userspace to actually obtain the page
>>size, e.g. PowerPC and MIPS. On some architectures, e.g. x86 and ARM,
>>the point is moot since PAGE_SIZE is always 2^12.
>>
>>a. Is this correct, or have I misunderstood the code?
>
> PowerPC always uses 12, even if PAGE_SHIFT is 16 (i.e. for 64k
> pages).
>

ACK on that. I was looking at old kernel sources (2.6.14-rc timeframe),
and I guess that one only supported 4K pages.

>>b. If so, is this right, or is this a bug? Right now both klibc and
>>µClibc consider the latter a bug.
>
> Glibc seems to expect it to always be 12, according to this excerpt
> from sysdeps/unix/sysv/linux/mmap64.c:

That's what I thought, too, but it doesn't seem to match reality.

This is what I've found so far: (64-bit architectures excluded)

arm - N/A (PAGE_SHIFT == 12)
arm26 - MMAP2_PAGE_SHIFT == 12
cris - MMAP2_PAGE_SHIFT == PAGE_SHIFT (13)
frv - MMAP2_PAGE_SHIFT == 12
h8300 - N/A (PAGE_SHIFT == 12)
i386 - N/A (PAGE_SHIFT == 12)
m32r - N/A (PAGE_SHIFT == 12)
m68k - MMAP2_PAGE_SHIFT == PAGE_SHIFT (variable)
mips - MMAP2_PAGE_SHIFT == PAGE_SHIFT (variable)
parisc - MMAP2_PAGE_SHIFT == 12
ppc - MMAP2_PAGE_SHIFT == 12
s390 - N/A (PAGE_SHIFT == 12)
sh - N/A (PAGE_SHIFT == 12)
sparc - MMAP2_PAGE_SHIFT == 12
v850 - N/A (PAGE_SHIFT == 12)
xtensa - N/A (PAGE_SHIFT == 12)

So, excluding 64-bit architectures, we have 3 architectures which expect
getpagesize() to be used, 5 which expect the constant value 12, and 8
which get the same result either way. In effect, we have a system call
with subtly different semantics across architectures, and there isn't
any clear distinction each way.

This is something I don't enjoy about Linux :-/

> /* This is always 12, even on architectures where PAGE_SHIFT != 12. */
> # ifndef MMAP2_PAGE_SHIFT
> # define MMAP2_PAGE_SHIFT 12
> # endif
>
> I would be very reluctant to change the shift to be PAGE_SHIFT, since
> that would be a change in the user/kernel ABI. Of course, userspace
> is still expected to make sure addresses and offsets are multiples of
> the page size (and thus the offset argument to mmap2 has to be a
> multiple of 16 if the page size is 64k).

Changing the user-kernel ABI is bad. I'm just trying to get to the
bottom with what the API actually *IS*.

-hpa
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2006-02-23 04:38    [W:0.077 / U:0.048 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site