]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - mm/shmem.c
memcg: fix shmem's swap accounting
[net-next-2.6.git] / mm / shmem.c
index bbb7b043c986c276eda32d9525598baaa7432bce..5d0de96c97897f463eaa0d469f86ad5f273664d5 100644 (file)
@@ -929,11 +929,11 @@ found:
        if (!inode)
                goto out;
        /*
-        * Charge page using GFP_HIGHUSER_MOVABLE while we can wait.
-        * charged back to the user(not to caller) when swap account is used.
+        * Charge page using GFP_KERNEL while we can wait.
+        * Charged back to the user(not to caller) when swap account is used.
+        * add_to_page_cache() will be called with GFP_NOWAIT.
         */
-       error = mem_cgroup_cache_charge_swapin(page, current->mm, GFP_KERNEL,
-                                       true);
+       error = mem_cgroup_cache_charge(page, current->mm, GFP_KERNEL);
        if (error)
                goto out;
        error = radix_tree_preload(GFP_KERNEL);
@@ -1270,16 +1270,6 @@ repeat:
                                goto repeat;
                        }
                        wait_on_page_locked(swappage);
-                       /*
-                        * We want to avoid charge at add_to_page_cache().
-                        * charge against this swap cache here.
-                        */
-                       if (mem_cgroup_cache_charge_swapin(swappage,
-                               current->mm, gfp & GFP_RECLAIM_MASK, false)) {
-                               page_cache_release(swappage);
-                               error = -ENOMEM;
-                               goto failed;
-                       }
                        page_cache_release(swappage);
                        goto repeat;
                }
@@ -1334,15 +1324,19 @@ repeat:
                } else {
                        shmem_swp_unmap(entry);
                        spin_unlock(&info->lock);
-                       unlock_page(swappage);
-                       page_cache_release(swappage);
                        if (error == -ENOMEM) {
                                /* allow reclaim from this memory cgroup */
-                               error = mem_cgroup_shrink_usage(current->mm,
+                               error = mem_cgroup_shrink_usage(swappage,
+                                                               current->mm,
                                                                gfp);
-                               if (error)
+                               if (error) {
+                                       unlock_page(swappage);
+                                       page_cache_release(swappage);
                                        goto failed;
+                               }
                        }
+                       unlock_page(swappage);
+                       page_cache_release(swappage);
                        goto repeat;
                }
        } else if (sgp == SGP_READ && !filepage) {