]> Pileus Git - ~andy/linux/blobdiff - mm/compaction.c
compact_pgdat: workaround lockdep warning in kswapd
[~andy/linux] / mm / compaction.c
index c4b344a95032a0f09cba718daf486a4b0e448e5f..a08bf219f88c8749ab920356220dcbedbc8cfdc6 100644 (file)
@@ -680,9 +680,6 @@ static int __compact_pgdat(pg_data_t *pgdat, struct compact_control *cc)
        int zoneid;
        struct zone *zone;
 
-       /* Flush pending updates to the LRU lists */
-       lru_add_drain_all();
-
        for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) {
 
                zone = &pgdat->node_zones[zoneid];
@@ -727,17 +724,12 @@ int compact_pgdat(pg_data_t *pgdat, int order)
 
 static int compact_node(int nid)
 {
-       pg_data_t *pgdat;
        struct compact_control cc = {
                .order = -1,
                .sync = true,
        };
 
-       if (nid < 0 || nid >= nr_node_ids || !node_online(nid))
-               return -EINVAL;
-       pgdat = NODE_DATA(nid);
-
-       return __compact_pgdat(pgdat, &cc);
+       return __compact_pgdat(NODE_DATA(nid), &cc);
 }
 
 /* Compact all nodes in the system */
@@ -745,6 +737,9 @@ static int compact_nodes(void)
 {
        int nid;
 
+       /* Flush pending updates to the LRU lists */
+       lru_add_drain_all();
+
        for_each_online_node(nid)
                compact_node(nid);
 
@@ -777,7 +772,14 @@ ssize_t sysfs_compact_node(struct device *dev,
                        struct device_attribute *attr,
                        const char *buf, size_t count)
 {
-       compact_node(dev->id);
+       int nid = dev->id;
+
+       if (nid >= 0 && nid < nr_node_ids && node_online(nid)) {
+               /* Flush pending updates to the LRU lists */
+               lru_add_drain_all();
+
+               compact_node(nid);
+       }
 
        return count;
 }