]> git.neil.brown.name Git - history.git/commitdiff
Import 2.1.45pre5 2.1.45pre5
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:13:31 +0000 (15:13 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:13:31 +0000 (15:13 -0500)
fs/dcache.c
include/linux/dcache.h
mm/vmscan.c

index 6147b006d69c18f4516f9e178beab9e913d49487..13f33871f3aaa2b9fdf4768abda355b59812229e 100644 (file)
@@ -95,16 +95,10 @@ repeat:
  * more memory, or simply when we need to unmount
  * something (at which point we need to unuse
  * all dentries).
- *
- * "priority" is a value between 0-6, 0 means that
- * we should work really hard on releasing stuff..
  */
-void shrink_dcache(int priority)
+void shrink_dcache(void)
 {
-       int nr = 42;    /* "random" number */
-
-       nr <<= 6; nr >>= priority;
-       do {
+       for (;;) {
                struct dentry *dentry;
                struct list_head *tmp = dentry_unused.prev;
 
@@ -128,7 +122,7 @@ void shrink_dcache(int priority)
                        d_free(dentry);
                        dput(parent);
                }
-       } while (--nr);
+       }
 }
 
 #define NAME_ALLOC_LEN(len)    ((len+16) & ~15)
index 7caacef5659253360fdd4047d9f4d9f901867e32..5664bfb0fdf6b82ec0250800774c0ea4b7b27b92 100644 (file)
@@ -61,7 +61,7 @@ extern void d_delete(struct dentry *);
 /* allocate/de-allocate */
 extern void d_free(struct dentry *);
 extern struct dentry * d_alloc(struct dentry * parent, const struct qstr *name);
-extern void shrink_dcache(int);
+extern void shrink_dcache(void);
 
 /* only used at mount-time */
 extern struct dentry * d_alloc_root(struct inode * root_inode, struct dentry * old_root);
index 716d1f2450246e9fb8f6cab633f08add78b1b530..21b4907a055b7c0b68a93988c60c73780bf86f49 100644 (file)
@@ -362,15 +362,21 @@ static inline int do_try_to_free_page(int priority, int dma, int wait)
                                return 1;
                        state = 1;
                case 1:
-                       if (kmem_cache_reap(i, dma, wait))
-                               return 1;
+                       shrink_dcache();
                        state = 2;
                case 2:
-                       if (shm_swap(i, dma))
+                       /*
+                        * We shouldn't have a priority here:
+                        * If we're low on memory we should
+                        * unconditionally throw away _all_
+                        * kmalloc caches!
+                        */
+                       if (kmem_cache_reap(0, dma, wait))
                                return 1;
                        state = 3;
                case 3:
-                       shrink_dcache(i);
+                       if (shm_swap(i, dma))
+                               return 1;
                        state = 4;
                default:
                        if (swap_out(i, dma, wait))