lkml.org 
[lkml]   [2004]   [Sep]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: /proc/sys/kernel/pid_max issues
On Sun, Sep 12, 2004 at 02:36:05AM -0700, William Lee Irwin III wrote:
> + if (map > &pidmap_array[pid_max/BITS_PER_PAGE])
> + map = pidmap_array;
> if (unlikely(!map->page)) {
> unsigned long page = get_zeroed_page(GFP_KERNEL);

If pid_max == BITS_PER_PAGE*n, none of &pidmap_array[pid_max/BITS_PER_PAGE]
is usable, so if we must complete a full revolution around pidmap_array[]
to discover a free pid slightly less than last_pid we will miss it. Hence:


-- wli

Index: mm4-2.6.9-rc1/kernel/pid.c
===================================================================
--- mm4-2.6.9-rc1.orig/kernel/pid.c 2004-09-08 05:46:18.000000000 -0700
+++ mm4-2.6.9-rc1/kernel/pid.c 2004-09-12 02:46:17.426981200 -0700
@@ -75,6 +75,8 @@
while (--*max_steps) {
if (++map == map_limit)
map = pidmap_array;
+ if (map > &pidmap_array[(pid_max-1)/BITS_PER_PAGE])
+ map = pidmap_array;
if (unlikely(!map->page)) {
unsigned long page = get_zeroed_page(GFP_KERNEL);
/*
@@ -135,13 +137,12 @@
*/
scan_more:
offset = find_next_zero_bit(map->page, BITS_PER_PAGE, offset);
- if (offset >= BITS_PER_PAGE)
+ pid = (map - pidmap_array) * BITS_PER_PAGE + offset;
+ if (offset >= BITS_PER_PAGE || pid >= pid_max)
goto next_map;
if (test_and_set_bit(offset, map->page))
goto scan_more;
-
/* we got the PID: */
- pid = (map - pidmap_array) * BITS_PER_PAGE + offset;
goto return_pid;

failure:
-
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: 2005-03-22 14:06    [W:0.058 / U:0.616 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site