|
|
@@ -2099,40 +2099,6 @@ static void cancel_charge(struct mem_cgroup *memcg, unsigned int nr_pages)
|
|
|
css_put_many(&memcg->css, nr_pages);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * try_get_mem_cgroup_from_page - look up page's memcg association
|
|
|
- * @page: the page
|
|
|
- *
|
|
|
- * Look up, get a css reference, and return the memcg that owns @page.
|
|
|
- *
|
|
|
- * The page must be locked to prevent racing with swap-in and page
|
|
|
- * cache charges. If coming from an unlocked page table, the caller
|
|
|
- * must ensure the page is on the LRU or this can race with charging.
|
|
|
- */
|
|
|
-struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)
|
|
|
-{
|
|
|
- struct mem_cgroup *memcg;
|
|
|
- unsigned short id;
|
|
|
- swp_entry_t ent;
|
|
|
-
|
|
|
- VM_BUG_ON_PAGE(!PageLocked(page), page);
|
|
|
-
|
|
|
- memcg = page->mem_cgroup;
|
|
|
- if (memcg) {
|
|
|
- if (!css_tryget_online(&memcg->css))
|
|
|
- memcg = NULL;
|
|
|
- } else if (PageSwapCache(page)) {
|
|
|
- ent.val = page_private(page);
|
|
|
- id = lookup_swap_cgroup_id(ent);
|
|
|
- rcu_read_lock();
|
|
|
- memcg = mem_cgroup_from_id(id);
|
|
|
- if (memcg && !css_tryget_online(&memcg->css))
|
|
|
- memcg = NULL;
|
|
|
- rcu_read_unlock();
|
|
|
- }
|
|
|
- return memcg;
|
|
|
-}
|
|
|
-
|
|
|
static void lock_page_lru(struct page *page, int *isolated)
|
|
|
{
|
|
|
struct zone *zone = page_zone(page);
|
|
|
@@ -5329,8 +5295,20 @@ int mem_cgroup_try_charge(struct page *page, struct mm_struct *mm,
|
|
|
* the page lock, which serializes swap cache removal, which
|
|
|
* in turn serializes uncharging.
|
|
|
*/
|
|
|
+ VM_BUG_ON_PAGE(!PageLocked(page), page);
|
|
|
if (page->mem_cgroup)
|
|
|
goto out;
|
|
|
+
|
|
|
+ if (do_swap_account) {
|
|
|
+ swp_entry_t ent = { .val = page_private(page), };
|
|
|
+ unsigned short id = lookup_swap_cgroup_id(ent);
|
|
|
+
|
|
|
+ rcu_read_lock();
|
|
|
+ memcg = mem_cgroup_from_id(id);
|
|
|
+ if (memcg && !css_tryget_online(&memcg->css))
|
|
|
+ memcg = NULL;
|
|
|
+ rcu_read_unlock();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (PageTransHuge(page)) {
|
|
|
@@ -5338,8 +5316,6 @@ int mem_cgroup_try_charge(struct page *page, struct mm_struct *mm,
|
|
|
VM_BUG_ON_PAGE(!PageTransHuge(page), page);
|
|
|
}
|
|
|
|
|
|
- if (do_swap_account && PageSwapCache(page))
|
|
|
- memcg = try_get_mem_cgroup_from_page(page);
|
|
|
if (!memcg)
|
|
|
memcg = get_mem_cgroup_from_mm(mm);
|
|
|
|