diff for duplicates of <20170809183825.GA26387@cmpxchg.org> diff --git a/a/1.txt b/N1/1.txt index f3c25fa..82d7097 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -4,252 +4,3 @@ On Tue, Aug 08, 2017 at 10:39:27PM -0400, Brad Bolen wrote: Brad, Jaegeuk, does the following patch address this problem? --- - -From cf0060892eb70bccbc8cedeac0a5756c8f7b975e Mon Sep 17 00:00:00 2001 -From: Johannes Weiner <hannes@cmpxchg.org> -Date: Wed, 9 Aug 2017 12:06:03 -0400 -Subject: [PATCH] mm: memcontrol: fix NULL pointer crash in - test_clear_page_writeback() - -Jaegeuk and Brad report a NULL pointer crash when writeback ending -tries to update the memcg stats: - -[] BUG: unable to handle kernel NULL pointer dereference at 00000000000003b0 -[] IP: test_clear_page_writeback+0x12e/0x2c0 -[...] -[] RIP: 0010:test_clear_page_writeback+0x12e/0x2c0 -[] RSP: 0018:ffff8e3abfd03d78 EFLAGS: 00010046 -[] RAX: 0000000000000000 RBX: ffffdb59c03f8900 RCX: ffffffffffffffe8 -[] RDX: 0000000000000000 RSI: 0000000000000010 RDI: ffff8e3abffeb000 -[] RBP: ffff8e3abfd03da8 R08: 0000000000020059 R09: 00000000fffffffc -[] R10: 0000000000000000 R11: 0000000000020048 R12: ffff8e3a8c39f668 -[] R13: 0000000000000001 R14: ffff8e3a8c39f680 R15: 0000000000000000 -[] FS: 0000000000000000(0000) GS:ffff8e3abfd00000(0000) knlGS:0000000000000000 -[] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 -[] CR2: 00000000000003b0 CR3: 000000002c5e1000 CR4: 00000000000406e0 -[] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 -[] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 -[] Call Trace: -[] <IRQ> -[] end_page_writeback+0x47/0x70 -[] f2fs_write_end_io+0x76/0x180 [f2fs] -[] bio_endio+0x9f/0x120 -[] blk_update_request+0xa8/0x2f0 -[] scsi_end_request+0x39/0x1d0 -[] scsi_io_completion+0x211/0x690 -[] scsi_finish_command+0xd9/0x120 -[] scsi_softirq_done+0x127/0x150 -[] __blk_mq_complete_request_remote+0x13/0x20 -[] flush_smp_call_function_queue+0x56/0x110 -[] generic_smp_call_function_single_interrupt+0x13/0x30 -[] smp_call_function_single_interrupt+0x27/0x40 -[] call_function_single_interrupt+0x89/0x90 -[] RIP: 0010:native_safe_halt+0x6/0x10 - -(gdb) l *(test_clear_page_writeback+0x12e) -0xffffffff811bae3e is in test_clear_page_writeback (./include/linux/memcontrol.h:619). -614 mod_node_page_state(page_pgdat(page), idx, val); -615 if (mem_cgroup_disabled() || !page->mem_cgroup) -616 return; -617 mod_memcg_state(page->mem_cgroup, idx, val); -618 pn = page->mem_cgroup->nodeinfo[page_to_nid(page)]; -619 this_cpu_add(pn->lruvec_stat->count[idx], val); -620 } -621 -622 unsigned long mem_cgroup_soft_limit_reclaim(pg_data_t *pgdat, int order, -623 gfp_t gfp_mask, - -The issue is that writeback doesn't hold a page reference and the page -might get freed after PG_writeback is cleared (and the mapping is -unlocked) in test_clear_page_writeback(). The stat functions looking -up the page's node or zone are safe, as those attributes are static -across allocation and free cycles. But page->mem_cgroup is not, and it -will get cleared if we race with truncation or migration. - -It appears this race window has been around for a while, but less -likely to trigger when the memcg stats were updated first thing after -PG_writeback is cleared. Recent changes reshuffled this code to update -the global node stats before the memcg ones, though, stretching the -race window out to an extent where people can reproduce the problem. - -Update test_clear_page_writeback() to look up and pin page->mem_cgroup -before clearing PG_writeback, then not use that pointer afterward. It -is a partial revert of 62cccb8c8e7a ("mm: simplify lock_page_memcg()") -but leaves the pageref-holding callsites that aren't affected alone. - -Fixes: 62cccb8c8e7a ("mm: simplify lock_page_memcg()") -Reported-by: Jaegeuk Kim <jaegeuk@kernel.org> -Reported-by: Bradley Bolen <bradleybolen@gmail.com> -Cc: <stable@vger.kernel.org> # 4.6+ -Signed-off-by: Johannes Weiner <hannes@cmpxchg.org> ---- - include/linux/memcontrol.h | 10 ++++++++-- - mm/memcontrol.c | 43 +++++++++++++++++++++++++++++++------------ - mm/page-writeback.c | 15 ++++++++++++--- - 3 files changed, 51 insertions(+), 17 deletions(-) - -diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h -index 3914e3dd6168..9b15a4bcfa77 100644 ---- a/include/linux/memcontrol.h -+++ b/include/linux/memcontrol.h -@@ -484,7 +484,8 @@ bool mem_cgroup_oom_synchronize(bool wait); - extern int do_swap_account; - #endif - --void lock_page_memcg(struct page *page); -+struct mem_cgroup *lock_page_memcg(struct page *page); -+void __unlock_page_memcg(struct mem_cgroup *memcg); - void unlock_page_memcg(struct page *page); - - static inline unsigned long memcg_page_state(struct mem_cgroup *memcg, -@@ -809,7 +810,12 @@ mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p) - { - } - --static inline void lock_page_memcg(struct page *page) -+static inline struct mem_cgroup *lock_page_memcg(struct page *page) -+{ -+ return NULL; -+} -+ -+static inline void __unlock_page_memcg(struct mem_cgroup *memcg) - { - } - -diff --git a/mm/memcontrol.c b/mm/memcontrol.c -index 3df3c04d73ab..e09741af816f 100644 ---- a/mm/memcontrol.c -+++ b/mm/memcontrol.c -@@ -1611,9 +1611,13 @@ bool mem_cgroup_oom_synchronize(bool handle) - * @page: the page - * - * This function protects unlocked LRU pages from being moved to -- * another cgroup and stabilizes their page->mem_cgroup binding. -+ * another cgroup. -+ * -+ * It ensures lifetime of the returned memcg. Caller is responsible -+ * for the lifetime of the page; __unlock_page_memcg() is available -+ * when @page might get freed inside the locked section. - */ --void lock_page_memcg(struct page *page) -+struct mem_cgroup *lock_page_memcg(struct page *page) - { - struct mem_cgroup *memcg; - unsigned long flags; -@@ -1622,18 +1626,24 @@ void lock_page_memcg(struct page *page) - * The RCU lock is held throughout the transaction. The fast - * path can get away without acquiring the memcg->move_lock - * because page moving starts with an RCU grace period. -- */ -+ * -+ * The RCU lock also protects the memcg from being freed when -+ * the page state that is going to change is the only thing -+ * preventing the page itself from being freed. E.g. writeback -+ * doesn't hold a page reference and relies on PG_writeback to -+ * keep off truncation, migration and so forth. -+ */ - rcu_read_lock(); - - if (mem_cgroup_disabled()) -- return; -+ return NULL; - again: - memcg = page->mem_cgroup; - if (unlikely(!memcg)) -- return; -+ return NULL; - - if (atomic_read(&memcg->moving_account) <= 0) -- return; -+ return memcg; - - spin_lock_irqsave(&memcg->move_lock, flags); - if (memcg != page->mem_cgroup) { -@@ -1649,18 +1659,18 @@ void lock_page_memcg(struct page *page) - memcg->move_lock_task = current; - memcg->move_lock_flags = flags; - -- return; -+ return memcg; - } - EXPORT_SYMBOL(lock_page_memcg); - - /** -- * unlock_page_memcg - unlock a page->mem_cgroup binding -- * @page: the page -+ * __unlock_page_memcg - unlock and unpin a memcg -+ * @memcg: the memcg -+ * -+ * Unlock and unpin a memcg returned by lock_page_memcg(). - */ --void unlock_page_memcg(struct page *page) -+void __unlock_page_memcg(struct mem_cgroup *memcg) - { -- struct mem_cgroup *memcg = page->mem_cgroup; -- - if (memcg && memcg->move_lock_task == current) { - unsigned long flags = memcg->move_lock_flags; - -@@ -1672,6 +1682,15 @@ void unlock_page_memcg(struct page *page) - - rcu_read_unlock(); - } -+ -+/** -+ * unlock_page_memcg - unlock a page->mem_cgroup binding -+ * @page: the page -+ */ -+void unlock_page_memcg(struct page *page) -+{ -+ __unlock_page_memcg(page->mem_cgroup); -+} - EXPORT_SYMBOL(unlock_page_memcg); - - /* -diff --git a/mm/page-writeback.c b/mm/page-writeback.c -index 96e93b214d31..bf050ab025b7 100644 ---- a/mm/page-writeback.c -+++ b/mm/page-writeback.c -@@ -2724,9 +2724,12 @@ EXPORT_SYMBOL(clear_page_dirty_for_io); - int test_clear_page_writeback(struct page *page) - { - struct address_space *mapping = page_mapping(page); -+ struct mem_cgroup *memcg; -+ struct lruvec *lruvec; - int ret; - -- lock_page_memcg(page); -+ memcg = lock_page_memcg(page); -+ lruvec = mem_cgroup_page_lruvec(page, page_pgdat(page)); - if (mapping && mapping_use_writeback_tags(mapping)) { - struct inode *inode = mapping->host; - struct backing_dev_info *bdi = inode_to_bdi(inode); -@@ -2754,12 +2757,18 @@ int test_clear_page_writeback(struct page *page) - } else { - ret = TestClearPageWriteback(page); - } -+ /* -+ * NOTE: Page might be free now! Writeback doesn't hold a page -+ * reference on its own, it relies on truncation to wait for -+ * the clearing of PG_writeback. The below can only access -+ * page state that is static across allocation cycles. -+ */ - if (ret) { -- dec_lruvec_page_state(page, NR_WRITEBACK); -+ dec_lruvec_state(lruvec, NR_WRITEBACK); - dec_zone_page_state(page, NR_ZONE_WRITE_PENDING); - inc_node_page_state(page, NR_WRITTEN); - } -- unlock_page_memcg(page); -+ __unlock_page_memcg(memcg); - return ret; - } - --- -2.13.3 - --- -To unsubscribe, send a message with 'unsubscribe linux-mm' in -the body to majordomo@kvack.org. For more info on Linux MM, -see: http://www.linux-mm.org/ . -Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> diff --git a/a/content_digest b/N1/content_digest index a433bf8..4f7c4bb 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -25,255 +25,6 @@ "\n" "Brad, Jaegeuk, does the following patch address this problem?\n" "\n" - "---\n" - "\n" - "From cf0060892eb70bccbc8cedeac0a5756c8f7b975e Mon Sep 17 00:00:00 2001\n" - "From: Johannes Weiner <hannes@cmpxchg.org>\n" - "Date: Wed, 9 Aug 2017 12:06:03 -0400\n" - "Subject: [PATCH] mm: memcontrol: fix NULL pointer crash in\n" - " test_clear_page_writeback()\n" - "\n" - "Jaegeuk and Brad report a NULL pointer crash when writeback ending\n" - "tries to update the memcg stats:\n" - "\n" - "[] BUG: unable to handle kernel NULL pointer dereference at 00000000000003b0\n" - "[] IP: test_clear_page_writeback+0x12e/0x2c0\n" - "[...]\n" - "[] RIP: 0010:test_clear_page_writeback+0x12e/0x2c0\n" - "[] RSP: 0018:ffff8e3abfd03d78 EFLAGS: 00010046\n" - "[] RAX: 0000000000000000 RBX: ffffdb59c03f8900 RCX: ffffffffffffffe8\n" - "[] RDX: 0000000000000000 RSI: 0000000000000010 RDI: ffff8e3abffeb000\n" - "[] RBP: ffff8e3abfd03da8 R08: 0000000000020059 R09: 00000000fffffffc\n" - "[] R10: 0000000000000000 R11: 0000000000020048 R12: ffff8e3a8c39f668\n" - "[] R13: 0000000000000001 R14: ffff8e3a8c39f680 R15: 0000000000000000\n" - "[] FS: 0000000000000000(0000) GS:ffff8e3abfd00000(0000) knlGS:0000000000000000\n" - "[] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033\n" - "[] CR2: 00000000000003b0 CR3: 000000002c5e1000 CR4: 00000000000406e0\n" - "[] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000\n" - "[] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400\n" - "[] Call Trace:\n" - "[] <IRQ>\n" - "[] end_page_writeback+0x47/0x70\n" - "[] f2fs_write_end_io+0x76/0x180 [f2fs]\n" - "[] bio_endio+0x9f/0x120\n" - "[] blk_update_request+0xa8/0x2f0\n" - "[] scsi_end_request+0x39/0x1d0\n" - "[] scsi_io_completion+0x211/0x690\n" - "[] scsi_finish_command+0xd9/0x120\n" - "[] scsi_softirq_done+0x127/0x150\n" - "[] __blk_mq_complete_request_remote+0x13/0x20\n" - "[] flush_smp_call_function_queue+0x56/0x110\n" - "[] generic_smp_call_function_single_interrupt+0x13/0x30\n" - "[] smp_call_function_single_interrupt+0x27/0x40\n" - "[] call_function_single_interrupt+0x89/0x90\n" - "[] RIP: 0010:native_safe_halt+0x6/0x10\n" - "\n" - "(gdb) l *(test_clear_page_writeback+0x12e)\n" - "0xffffffff811bae3e is in test_clear_page_writeback (./include/linux/memcontrol.h:619).\n" - "614\t\tmod_node_page_state(page_pgdat(page), idx, val);\n" - "615\t\tif (mem_cgroup_disabled() || !page->mem_cgroup)\n" - "616\t\t\treturn;\n" - "617\t\tmod_memcg_state(page->mem_cgroup, idx, val);\n" - "618\t\tpn = page->mem_cgroup->nodeinfo[page_to_nid(page)];\n" - "619\t\tthis_cpu_add(pn->lruvec_stat->count[idx], val);\n" - "620\t}\n" - "621\n" - "622\tunsigned long mem_cgroup_soft_limit_reclaim(pg_data_t *pgdat, int order,\n" - "623\t\t\t\t\t\t\tgfp_t gfp_mask,\n" - "\n" - "The issue is that writeback doesn't hold a page reference and the page\n" - "might get freed after PG_writeback is cleared (and the mapping is\n" - "unlocked) in test_clear_page_writeback(). The stat functions looking\n" - "up the page's node or zone are safe, as those attributes are static\n" - "across allocation and free cycles. But page->mem_cgroup is not, and it\n" - "will get cleared if we race with truncation or migration.\n" - "\n" - "It appears this race window has been around for a while, but less\n" - "likely to trigger when the memcg stats were updated first thing after\n" - "PG_writeback is cleared. Recent changes reshuffled this code to update\n" - "the global node stats before the memcg ones, though, stretching the\n" - "race window out to an extent where people can reproduce the problem.\n" - "\n" - "Update test_clear_page_writeback() to look up and pin page->mem_cgroup\n" - "before clearing PG_writeback, then not use that pointer afterward. It\n" - "is a partial revert of 62cccb8c8e7a (\"mm: simplify lock_page_memcg()\")\n" - "but leaves the pageref-holding callsites that aren't affected alone.\n" - "\n" - "Fixes: 62cccb8c8e7a (\"mm: simplify lock_page_memcg()\")\n" - "Reported-by: Jaegeuk Kim <jaegeuk@kernel.org>\n" - "Reported-by: Bradley Bolen <bradleybolen@gmail.com>\n" - "Cc: <stable@vger.kernel.org> # 4.6+\n" - "Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>\n" - "---\n" - " include/linux/memcontrol.h | 10 ++++++++--\n" - " mm/memcontrol.c | 43 +++++++++++++++++++++++++++++++------------\n" - " mm/page-writeback.c | 15 ++++++++++++---\n" - " 3 files changed, 51 insertions(+), 17 deletions(-)\n" - "\n" - "diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h\n" - "index 3914e3dd6168..9b15a4bcfa77 100644\n" - "--- a/include/linux/memcontrol.h\n" - "+++ b/include/linux/memcontrol.h\n" - "@@ -484,7 +484,8 @@ bool mem_cgroup_oom_synchronize(bool wait);\n" - " extern int do_swap_account;\n" - " #endif\n" - " \n" - "-void lock_page_memcg(struct page *page);\n" - "+struct mem_cgroup *lock_page_memcg(struct page *page);\n" - "+void __unlock_page_memcg(struct mem_cgroup *memcg);\n" - " void unlock_page_memcg(struct page *page);\n" - " \n" - " static inline unsigned long memcg_page_state(struct mem_cgroup *memcg,\n" - "@@ -809,7 +810,12 @@ mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)\n" - " {\n" - " }\n" - " \n" - "-static inline void lock_page_memcg(struct page *page)\n" - "+static inline struct mem_cgroup *lock_page_memcg(struct page *page)\n" - "+{\n" - "+\treturn NULL;\n" - "+}\n" - "+\n" - "+static inline void __unlock_page_memcg(struct mem_cgroup *memcg)\n" - " {\n" - " }\n" - " \n" - "diff --git a/mm/memcontrol.c b/mm/memcontrol.c\n" - "index 3df3c04d73ab..e09741af816f 100644\n" - "--- a/mm/memcontrol.c\n" - "+++ b/mm/memcontrol.c\n" - "@@ -1611,9 +1611,13 @@ bool mem_cgroup_oom_synchronize(bool handle)\n" - " * @page: the page\n" - " *\n" - " * This function protects unlocked LRU pages from being moved to\n" - "- * another cgroup and stabilizes their page->mem_cgroup binding.\n" - "+ * another cgroup.\n" - "+ *\n" - "+ * It ensures lifetime of the returned memcg. Caller is responsible\n" - "+ * for the lifetime of the page; __unlock_page_memcg() is available\n" - "+ * when @page might get freed inside the locked section.\n" - " */\n" - "-void lock_page_memcg(struct page *page)\n" - "+struct mem_cgroup *lock_page_memcg(struct page *page)\n" - " {\n" - " \tstruct mem_cgroup *memcg;\n" - " \tunsigned long flags;\n" - "@@ -1622,18 +1626,24 @@ void lock_page_memcg(struct page *page)\n" - " \t * The RCU lock is held throughout the transaction. The fast\n" - " \t * path can get away without acquiring the memcg->move_lock\n" - " \t * because page moving starts with an RCU grace period.\n" - "-\t */\n" - "+\t *\n" - "+\t * The RCU lock also protects the memcg from being freed when\n" - "+\t * the page state that is going to change is the only thing\n" - "+\t * preventing the page itself from being freed. E.g. writeback\n" - "+\t * doesn't hold a page reference and relies on PG_writeback to\n" - "+\t * keep off truncation, migration and so forth.\n" - "+ */\n" - " \trcu_read_lock();\n" - " \n" - " \tif (mem_cgroup_disabled())\n" - "-\t\treturn;\n" - "+\t\treturn NULL;\n" - " again:\n" - " \tmemcg = page->mem_cgroup;\n" - " \tif (unlikely(!memcg))\n" - "-\t\treturn;\n" - "+\t\treturn NULL;\n" - " \n" - " \tif (atomic_read(&memcg->moving_account) <= 0)\n" - "-\t\treturn;\n" - "+\t\treturn memcg;\n" - " \n" - " \tspin_lock_irqsave(&memcg->move_lock, flags);\n" - " \tif (memcg != page->mem_cgroup) {\n" - "@@ -1649,18 +1659,18 @@ void lock_page_memcg(struct page *page)\n" - " \tmemcg->move_lock_task = current;\n" - " \tmemcg->move_lock_flags = flags;\n" - " \n" - "-\treturn;\n" - "+\treturn memcg;\n" - " }\n" - " EXPORT_SYMBOL(lock_page_memcg);\n" - " \n" - " /**\n" - "- * unlock_page_memcg - unlock a page->mem_cgroup binding\n" - "- * @page: the page\n" - "+ * __unlock_page_memcg - unlock and unpin a memcg\n" - "+ * @memcg: the memcg\n" - "+ *\n" - "+ * Unlock and unpin a memcg returned by lock_page_memcg().\n" - " */\n" - "-void unlock_page_memcg(struct page *page)\n" - "+void __unlock_page_memcg(struct mem_cgroup *memcg)\n" - " {\n" - "-\tstruct mem_cgroup *memcg = page->mem_cgroup;\n" - "-\n" - " \tif (memcg && memcg->move_lock_task == current) {\n" - " \t\tunsigned long flags = memcg->move_lock_flags;\n" - " \n" - "@@ -1672,6 +1682,15 @@ void unlock_page_memcg(struct page *page)\n" - " \n" - " \trcu_read_unlock();\n" - " }\n" - "+\n" - "+/**\n" - "+ * unlock_page_memcg - unlock a page->mem_cgroup binding\n" - "+ * @page: the page\n" - "+ */\n" - "+void unlock_page_memcg(struct page *page)\n" - "+{\n" - "+\t__unlock_page_memcg(page->mem_cgroup);\n" - "+}\n" - " EXPORT_SYMBOL(unlock_page_memcg);\n" - " \n" - " /*\n" - "diff --git a/mm/page-writeback.c b/mm/page-writeback.c\n" - "index 96e93b214d31..bf050ab025b7 100644\n" - "--- a/mm/page-writeback.c\n" - "+++ b/mm/page-writeback.c\n" - "@@ -2724,9 +2724,12 @@ EXPORT_SYMBOL(clear_page_dirty_for_io);\n" - " int test_clear_page_writeback(struct page *page)\n" - " {\n" - " \tstruct address_space *mapping = page_mapping(page);\n" - "+\tstruct mem_cgroup *memcg;\n" - "+\tstruct lruvec *lruvec;\n" - " \tint ret;\n" - " \n" - "-\tlock_page_memcg(page);\n" - "+\tmemcg = lock_page_memcg(page);\n" - "+\tlruvec = mem_cgroup_page_lruvec(page, page_pgdat(page));\n" - " \tif (mapping && mapping_use_writeback_tags(mapping)) {\n" - " \t\tstruct inode *inode = mapping->host;\n" - " \t\tstruct backing_dev_info *bdi = inode_to_bdi(inode);\n" - "@@ -2754,12 +2757,18 @@ int test_clear_page_writeback(struct page *page)\n" - " \t} else {\n" - " \t\tret = TestClearPageWriteback(page);\n" - " \t}\n" - "+\t/*\n" - "+\t * NOTE: Page might be free now! Writeback doesn't hold a page\n" - "+\t * reference on its own, it relies on truncation to wait for\n" - "+\t * the clearing of PG_writeback. The below can only access\n" - "+\t * page state that is static across allocation cycles.\n" - "+\t */\n" - " \tif (ret) {\n" - "-\t\tdec_lruvec_page_state(page, NR_WRITEBACK);\n" - "+\t\tdec_lruvec_state(lruvec, NR_WRITEBACK);\n" - " \t\tdec_zone_page_state(page, NR_ZONE_WRITE_PENDING);\n" - " \t\tinc_node_page_state(page, NR_WRITTEN);\n" - " \t}\n" - "-\tunlock_page_memcg(page);\n" - "+\t__unlock_page_memcg(memcg);\n" - " \treturn ret;\n" - " }\n" - " \n" - "-- \n" - "2.13.3\n" - "\n" - "--\n" - "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" - "the body to majordomo@kvack.org. For more info on Linux MM,\n" - "see: http://www.linux-mm.org/ .\n" - "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" + --- -b1e6673e241e1b46456f21e1904e4011bb61beb583f46e094f0b27cfc7a139a4 +a8fe0634bbeef2af2a477f7174b6fa7ca9d74ae72b29337c313ac3d201c44638
diff --git a/a/1.txt b/N2/1.txt index f3c25fa..83db2c8 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -5,7 +5,7 @@ Brad, Jaegeuk, does the following patch address this problem? --- -From cf0060892eb70bccbc8cedeac0a5756c8f7b975e Mon Sep 17 00:00:00 2001 +>From cf0060892eb70bccbc8cedeac0a5756c8f7b975e Mon Sep 17 00:00:00 2001 From: Johannes Weiner <hannes@cmpxchg.org> Date: Wed, 9 Aug 2017 12:06:03 -0400 Subject: [PATCH] mm: memcontrol: fix NULL pointer crash in @@ -247,9 +247,3 @@ index 96e93b214d31..bf050ab025b7 100644 -- 2.13.3 - --- -To unsubscribe, send a message with 'unsubscribe linux-mm' in -the body to majordomo@kvack.org. For more info on Linux MM, -see: http://www.linux-mm.org/ . -Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> diff --git a/a/content_digest b/N2/content_digest index a433bf8..9c099f7 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -27,7 +27,7 @@ "\n" "---\n" "\n" - "From cf0060892eb70bccbc8cedeac0a5756c8f7b975e Mon Sep 17 00:00:00 2001\n" + ">From cf0060892eb70bccbc8cedeac0a5756c8f7b975e Mon Sep 17 00:00:00 2001\n" "From: Johannes Weiner <hannes@cmpxchg.org>\n" "Date: Wed, 9 Aug 2017 12:06:03 -0400\n" "Subject: [PATCH] mm: memcontrol: fix NULL pointer crash in\n" @@ -268,12 +268,6 @@ " }\n" " \n" "-- \n" - "2.13.3\n" - "\n" - "--\n" - "To unsubscribe, send a message with 'unsubscribe linux-mm' in\n" - "the body to majordomo@kvack.org. For more info on Linux MM,\n" - "see: http://www.linux-mm.org/ .\n" - "Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>" + 2.13.3 -b1e6673e241e1b46456f21e1904e4011bb61beb583f46e094f0b27cfc7a139a4 +8a9b12b17bed84abc8112c1bd5b46c9bccbc12704a9b362ac1fd1bdc179714db
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.