[patch-2.4.0-test10-pre3] logic of __alloc_pages().

From: Tigran Aivazian (tigran@veritas.com)
Date: Sun Oct 15 2000 - 15:06:18 EST


Hi Linus and Rik,

The last for(;;) loop in mm/page_allo.c:__alloc_pages() looks strange to
me:

        for (;;) {
                struct page * page = NULL;

                ...

                if (direct_reclaim)
                        page = reclaim_page(z);
                if (page)
                        return page;
               
                ....
                if (!page)
                        page = rmqueue(z, order);
                if (page)
                        return page;
        }

a) if direct_reclaim == 0 then page will remain NULL so the
if(page) should be moved inside if(direct_reclaim) instead of being tested
on each iteration unnecessarily.

b) if (!page) is redundant as page==NULL at that point, if it wasn't then
it would have been returned earlier

Am I missing something obvious? Or perhaps one should remember the fact
that 'int x = 0' inside for(;;) means x is set to 0 on each for()
iteration.... :)

Here is the patch, tested under 2.4.0-test10-pre3 (also removed redundant
page = NULL at the beginning).

Regards,
Tigran

--- linux/mm/page_alloc.c Sun Oct 15 20:40:38 2000
+++ work/mm/page_alloc.c Sun Oct 15 20:53:53 2000
@@ -287,7 +287,7 @@
         zone_t **zone;
         int direct_reclaim = 0;
         unsigned int gfp_mask = zonelist->gfp_mask;
- struct page * page = NULL;
+ struct page * page;
 
         /*
          * Allocations put pressure on the VM subsystem.
@@ -510,17 +510,17 @@
                  * happen when the OOM killer selects this task for
                  * instant execution...
                  */
- if (direct_reclaim)
+ if (direct_reclaim) {
                         page = reclaim_page(z);
- if (page)
- return page;
+ if (page)
+ return page;
+ }
 
                 /* XXX: is pages_min/4 a good amount to reserve for this? */
                 if (z->free_pages < z->pages_min / 4 &&
                                 !(current->flags & PF_MEMALLOC))
                         continue;
- if (!page)
- page = rmqueue(z, order);
+ page = rmqueue(z, order);
                 if (page)
                         return page;
         }

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



This archive was generated by hypermail 2b29 : Sun Oct 15 2000 - 21:00:28 EST