lkml.org 
[lkml]   [2008]   [Jul]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
Subject,
Problem Description:
The following issue affects the setrlimit() and getrlimit() system
calls on Linux 2.6.13 (and earlier) on x86.
The Problem is filed at kernel.org bug 5042
(http://bugzilla.kernel.org/show_bug.cgi?id=5042)

With setrlimit()/getrlimit(), resource limits can not be set >
2^32-1 on x86 as internally, resource limits are represented in the
'rlimit' structure (defined in include/linux/resource.h) as unsigned
longs, meaning 32 bits on x86. The most pertinent limit here is
RLIMIT_FSIZE, which specifies the maximum size to which a file can
grow: to be useful, this limit must be represented using a type that
is as wide as the type used to represent file offsets, i.e., as wide
as a 64-bit off_t.

Current versions of glibc (e.g., 2.3.5) deal with this situation
somewhat strangely: if a program compiled with
_FILE_OFFSET_BITS set to 64 (i.e., off_t is thus 'long long' -- 64
bits) tries to set a resource limit to a value
larger than can be represented in a 32-bit unsigned long, then the
glibc wrapper for setrlimit() silently converts
the limit value to RLIM_INFINITY.
In other words, the requested resource limit setting is silently
ignored. (One could argue that perhaps the glibc
wrapper should give an error, rather than silently turning a very
large limit into infinity; however, the glibc
developers instead seem to have decided on the current behaviour
as a means of dealing with what is fundamentally a
kernel problem.)

(NOTE: This problem is not merely a theoretical one facing
programmers developing new applications. Since many x86
distributions compile all (file) utilities with
-D_FILE_OFFSET_BITS=64, this issue can bite end-users as well, if
they expect to be able to set resource limits greater than 2^32-1.)

The solution to this problem would require new setrlimit64() and
getrlimit64() system calls on x86,
and the existing 32-bit system calls would need to be retained so
that existing binaries would still run.

Design Approach:
Add two system calls sys_setrlimit64()/sys_getrlimit64().
And a type 'struct rlimit64' to accomodate limits more <= 2^64-1

Implementation Details:
Inclutions: struct rlimit64, struct rlimit64
rlim64[RLIM64_NRLIMITS] to task_struct

Test Results:
Test results are posted as Comment#6 to
http://bugzilla.kernel.org/show_bug.cgi?id=5042
Issues Facing:
Though the limits of 'rlim64 of task_struct' are initialized
to RLIM64_INFINITY in linux/init_task.h, garbage values are set to
them. Placed some printks in sys_getrlimit64 to print the values of
'rlim64 of task_struct'; the printk statements will be execute when
getrlimit64() is invoked.

the output of dmesg is as follows:
[ 111.221402] resource = 1, RLIM64_INFINITY = ffffffffffffffff,
RLIMIT_FSIZE = 1, RLIM64_NLIMITS = 2
[ 111.221411] current rlim64 : max64 = f4967194, cur64 =
f496719400000001
[ 111.221416] value (local var, before) : max64 = c02f9730b7f4cce0,
cur64 =b7f18ff4f4ae5e00
[ 111.221421] value (after assignment) : max64 = f4967194, cur64 =
f496719400000001
[ 118.437395] resource = 1, RLIM64_INFINITY = ffffffffffffffff,
RLIMIT_FSIZE = 1, RLIM64_NLIMITS = 2
[ 118.437406] current rlim64 : max64 = f499ff98f499ff98,
cur64 = fe86a13df498a628
[ 118.437411] value (local var, before) : max64 = c02f9730b7f94ce0,
cur64 = b7f60ff4f4b41e00
[ 118.437419] value (after assignment) : max64 = f499ff98f499ff98,
cur64 = fe86a13df498a628


Signed-off-by: Narendra Prasad Madanapalli <narendramind@gmail.com>
[unhandled content-type:application/octet-stream]
\
 
 \ /
  Last update: 2008-07-28 17:23    [W:0.061 / U:0.080 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site