Skip to contentSkip to conversation

getpagesize / libsysfs broken with 0.148

PATCH Hannes Reinecke 4 participants 6 messages Jul 15, 2004

lore
Share & tools
lore
#0 lore raw

Hi all,

the implementation of getpagesize() is broken in klibc.

klibc uses sysinfo.mem_unit, which linux interpretes as the memory unit all other memory values returned are to be multiplied with. So it's perfectly ok for the linux sysinfo() to return a mem_unit of '1', which is does if the memory available for this machine fits into the counter. For the unbelievers, have a look in kernel/timer.c:sys_sysinfo().

As a quick hack I've added a check for mem_unit==1 and reset the page_size to 4096 on those cases.

Naturally, this is not the right fix. The right fix would be to get the values from the kernel headers and/or some magic juju for those machines with variable pagesize.

It probably would not have been noticed, but as libsysfs insists on doing all reads from sysfs attributes with a length of pagesize, the failures were ... interesting.

So in short, udev does _not_ work with klibc until that (or an equivalent) patch is applied.

Cheers,

Hannes

Signature · 4 lines
Dr. Hannes Reinecke			[email protected]
SuSE Linux AG				S390 & zSeries
Maxfeldstraße 5				+49 911 74053 688
90409 Nürnberg				http://www.suse.de
klibc/getpagesize.c renamed from klibc/getpagesize.c.orig +2 -1
@@ -20,5 +20,6 @@
   if ( rv == -1 )
     return -1;
 
-  return (page_size = si.mem_unit);
+  /* sysinfo returns 1 for mem_unit in some cases, so default to 4096. */
+  return (page_size = (si.mem_unit == 1 ? 4096 : si.mem_unit));
 }
#1 lore raw
Quoted 3 lines · Hannes Reinecke

Hi all,

the implementation of getpagesize() is broken in klibc.

...

Hannes, care to send more patches from the Suse udev rpm upstream?

-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_idG21&alloc_id040&op=click
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel

#2 lore raw
In reply to Hannes Reinecke
Quoted 10 lines · Harald Hoyer
Quoted 3 lines · Hannes Reinecke

Hi all,

the implementation of getpagesize() is broken in klibc.

...

Hannes, care to send more patches from the Suse udev rpm upstream?

About to do it. Watch this space.

Cheers,

Hannes

Signature · 15 lines
Dr. Hannes Reinecke			[email protected]
SuSE Linux AG				S390 & zSeries
Maxfeldstraße 5				+49 911 74053 688
90409 Nürnberg				http://www.suse.de


-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_idG21&alloc_id040&opÌk
_______________________________________________
Linux-hotplug-devel mailing list  http://linux-hotplug.sourceforge.net
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel
#3 lore raw
In reply to Hannes Reinecke
Quoted 14 lines · Hannes Reinecke

Hi all,

the implementation of getpagesize() is broken in klibc.

klibc uses sysinfo.mem_unit, which linux interpretes as the memory unit all other memory values returned are to be multiplied with. So it's perfectly ok for the linux sysinfo() to return a mem_unit of '1', which is does if the memory available for this machine fits into the counter.
For the unbelievers, have a look in kernel/timer.c:sys_sysinfo().

As a quick hack I've added a check for mem_unit=1 and reset the page_size to 4096 on those cases.

Quoted 7 lines

Naturally, this is not the right fix. The right fix would be to get the values from the kernel headers and/or some magic juju for those machines with variable pagesize.

It probably would not have been noticed, but as libsysfs insists on doing all reads from sysfs attributes with a length of pagesize, the failures were ... interesting.

Libsysfs reads with length of pagesize because that was a sysfs limitation. Has sysfs changed?

There use to be an ifdef klibc around the getpagesize() call but that seems to have been removed at some point.

Thanks,

Dan

Quoted 6 lines

So in short, udev does _not_ work with klibc until that (or an equivalent) patch is applied.

Cheers,

Hannes

-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_idG21&alloc_id040&op=click
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel

#4 lore raw
In reply to Hannes Reinecke
Quoted 12 lines · Hannes Reinecke

Hi all,

the implementation of getpagesize() is broken in klibc.

klibc uses sysinfo.mem_unit, which linux interpretes as the memory unit all other memory values returned are to be multiplied with. So it's perfectly ok for the linux sysinfo() to return a mem_unit of '1', which is does if the memory available for this machine fits into the counter.
For the unbelievers, have a look in kernel/timer.c:sys_sysinfo().

Quoted 3 lines

As a quick hack I've added a check for mem_unit=1 and reset the page_size to 4096 on those cases.

*SIGH* So much for the claim that there actually existed a sane way to get the page size across platforms. This is particularly nasty because of the definition of mmap2().

The kernel headers don't work very well since page size is a kernel-compile-time option on some platforms, e.g. MIPS, and dynamic on some platforms.

-hpa

-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_idG21&alloc_id040&op=click
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel

#5 lore raw
In reply to Hannes Reinecke
Quoted 9 lines · H. Peter Anvin

*SIGH* So much for the claim that there actually existed a sane way to get the page size across platforms. This is particularly nasty because of the definition of mmap2().

The kernel headers don't work very well since page size is a kernel-compile-time option on some platforms, e.g. MIPS, and dynamic on some platforms.

OK, Arjan van der Ven suggested using the AT_PAGESZ vector entry in the ELF header; this provides a nice and uniform solution across all platforms.

-hpa

-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_idG21&alloc_id040&op=click
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel