nmi_backtrace: generate one-line reports for idle cpus
[cascardo/linux.git] / mm / page-writeback.c
index f4cd7d8..439cc63 100644 (file)
@@ -1965,36 +1965,6 @@ bool wb_over_bg_thresh(struct bdi_writeback *wb)
        return false;
 }
 
-void throttle_vm_writeout(gfp_t gfp_mask)
-{
-       unsigned long background_thresh;
-       unsigned long dirty_thresh;
-
-        for ( ; ; ) {
-               global_dirty_limits(&background_thresh, &dirty_thresh);
-               dirty_thresh = hard_dirty_limit(&global_wb_domain, dirty_thresh);
-
-                /*
-                 * Boost the allowable dirty threshold a bit for page
-                 * allocators so they don't get DoS'ed by heavy writers
-                 */
-                dirty_thresh += dirty_thresh / 10;      /* wheeee... */
-
-                if (global_node_page_state(NR_UNSTABLE_NFS) +
-                       global_node_page_state(NR_WRITEBACK) <= dirty_thresh)
-                               break;
-                congestion_wait(BLK_RW_ASYNC, HZ/10);
-
-               /*
-                * The caller might hold locks which can prevent IO completion
-                * or progress in the filesystem.  So we cannot just sit here
-                * waiting for IO to complete.
-                */
-               if ((gfp_mask & (__GFP_FS|__GFP_IO)) != (__GFP_FS|__GFP_IO))
-                       break;
-        }
-}
-
 /*
  * sysctl handler for /proc/sys/vm/dirty_writeback_centisecs
  */
@@ -2080,26 +2050,12 @@ void writeback_set_ratelimit(void)
                ratelimit_pages = 16;
 }
 
-static int
-ratelimit_handler(struct notifier_block *self, unsigned long action,
-                 void *hcpu)
+static int page_writeback_cpu_online(unsigned int cpu)
 {
-
-       switch (action & ~CPU_TASKS_FROZEN) {
-       case CPU_ONLINE:
-       case CPU_DEAD:
-               writeback_set_ratelimit();
-               return NOTIFY_OK;
-       default:
-               return NOTIFY_DONE;
-       }
+       writeback_set_ratelimit();
+       return 0;
 }
 
-static struct notifier_block ratelimit_nb = {
-       .notifier_call  = ratelimit_handler,
-       .next           = NULL,
-};
-
 /*
  * Called early on to tune the page writeback dirty limits.
  *
@@ -2122,8 +2078,10 @@ void __init page_writeback_init(void)
 {
        BUG_ON(wb_domain_init(&global_wb_domain, GFP_KERNEL));
 
-       writeback_set_ratelimit();
-       register_cpu_notifier(&ratelimit_nb);
+       cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "mm/writeback:online",
+                         page_writeback_cpu_online, NULL);
+       cpuhp_setup_state(CPUHP_MM_WRITEBACK_DEAD, "mm/writeback:dead", NULL,
+                         page_writeback_cpu_online);
 }
 
 /**
@@ -2758,7 +2716,7 @@ int test_clear_page_writeback(struct page *page)
        int ret;
 
        lock_page_memcg(page);
-       if (mapping) {
+       if (mapping && mapping_use_writeback_tags(mapping)) {
                struct inode *inode = mapping->host;
                struct backing_dev_info *bdi = inode_to_bdi(inode);
                unsigned long flags;
@@ -2801,7 +2759,7 @@ int __test_set_page_writeback(struct page *page, bool keep_write)
        int ret;
 
        lock_page_memcg(page);
-       if (mapping) {
+       if (mapping && mapping_use_writeback_tags(mapping)) {
                struct inode *inode = mapping->host;
                struct backing_dev_info *bdi = inode_to_bdi(inode);
                unsigned long flags;