]> rtime.felk.cvut.cz Git - zynq/linux.git/blobdiff - mm/workingset.c
Merge branch '4.0.8-rt6'
[zynq/linux.git] / mm / workingset.c
index aa017133744b227bed7592ea6cc32f360c3e142c..263d0194734a5ffd1b193da4b70c00e5b054b1dc 100644 (file)
@@ -264,7 +264,8 @@ void workingset_activation(struct page *page)
  * point where they would still be useful.
  */
 
-struct list_lru workingset_shadow_nodes;
+struct list_lru __workingset_shadow_nodes;
+DEFINE_LOCAL_IRQ_LOCK(workingset_shadow_lock);
 
 static unsigned long count_shadow_nodes(struct shrinker *shrinker,
                                        struct shrink_control *sc)
@@ -274,9 +275,9 @@ static unsigned long count_shadow_nodes(struct shrinker *shrinker,
        unsigned long pages;
 
        /* list_lru lock nests inside IRQ-safe mapping->tree_lock */
-       local_irq_disable();
-       shadow_nodes = list_lru_shrink_count(&workingset_shadow_nodes, sc);
-       local_irq_enable();
+       local_lock_irq(workingset_shadow_lock);
+       shadow_nodes = list_lru_shrink_count(&__workingset_shadow_nodes, sc);
+       local_unlock_irq(workingset_shadow_lock);
 
        pages = node_present_pages(sc->nid);
        /*
@@ -363,9 +364,9 @@ static enum lru_status shadow_lru_isolate(struct list_head *item,
        spin_unlock(&mapping->tree_lock);
        ret = LRU_REMOVED_RETRY;
 out:
-       local_irq_enable();
+       local_unlock_irq(workingset_shadow_lock);
        cond_resched();
-       local_irq_disable();
+       local_lock_irq(workingset_shadow_lock);
        spin_lock(lru_lock);
        return ret;
 }
@@ -376,10 +377,10 @@ static unsigned long scan_shadow_nodes(struct shrinker *shrinker,
        unsigned long ret;
 
        /* list_lru lock nests inside IRQ-safe mapping->tree_lock */
-       local_irq_disable();
-       ret =  list_lru_shrink_walk(&workingset_shadow_nodes, sc,
+       local_lock_irq(workingset_shadow_lock);
+       ret =  list_lru_shrink_walk(&__workingset_shadow_nodes, sc,
                                    shadow_lru_isolate, NULL);
-       local_irq_enable();
+       local_unlock_irq(workingset_shadow_lock);
        return ret;
 }
 
@@ -400,7 +401,7 @@ static int __init workingset_init(void)
 {
        int ret;
 
-       ret = list_lru_init_key(&workingset_shadow_nodes, &shadow_nodes_key);
+       ret = list_lru_init_key(&__workingset_shadow_nodes, &shadow_nodes_key);
        if (ret)
                goto err;
        ret = register_shrinker(&workingset_shadow_shrinker);
@@ -408,7 +409,7 @@ static int __init workingset_init(void)
                goto err_list_lru;
        return 0;
 err_list_lru:
-       list_lru_destroy(&workingset_shadow_nodes);
+       list_lru_destroy(&__workingset_shadow_nodes);
 err:
        return ret;
 }