From: Greg Kroah-Hartman Date: Mon, 7 Jul 2014 23:11:54 +0000 (-0700) Subject: delete queue-3.15/fs-seq_file-fallback-to-vmalloc-allocation.patch X-Git-Tag: v3.4.98~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=aa3b4ce3fc5e4238ba5a74866b2e21265b134a49;p=thirdparty%2Fkernel%2Fstable-queue.git delete queue-3.15/fs-seq_file-fallback-to-vmalloc-allocation.patch --- diff --git a/queue-3.15/fs-seq_file-fallback-to-vmalloc-allocation.patch b/queue-3.15/fs-seq_file-fallback-to-vmalloc-allocation.patch deleted file mode 100644 index 991e8e1cac7..00000000000 --- a/queue-3.15/fs-seq_file-fallback-to-vmalloc-allocation.patch +++ /dev/null @@ -1,156 +0,0 @@ -From 058504edd02667eef8fac9be27ab3ea74332e9b4 Mon Sep 17 00:00:00 2001 -From: Heiko Carstens -Date: Wed, 2 Jul 2014 15:22:37 -0700 -Subject: fs/seq_file: fallback to vmalloc allocation - -From: Heiko Carstens - -commit 058504edd02667eef8fac9be27ab3ea74332e9b4 upstream. - -There are a couple of seq_files which use the single_open() interface. -This interface requires that the whole output must fit into a single -buffer. - -E.g. for /proc/stat allocation failures have been observed because an -order-4 memory allocation failed due to memory fragmentation. In such -situations reading /proc/stat is not possible anymore. - -Therefore change the seq_file code to fallback to vmalloc allocations -which will usually result in a couple of order-0 allocations and hence -also work if memory is fragmented. - -For reference a call trace where reading from /proc/stat failed: - - sadc: page allocation failure: order:4, mode:0x1040d0 - CPU: 1 PID: 192063 Comm: sadc Not tainted 3.10.0-123.el7.s390x #1 - [...] - Call Trace: - show_stack+0x6c/0xe8 - warn_alloc_failed+0xd6/0x138 - __alloc_pages_nodemask+0x9da/0xb68 - __get_free_pages+0x2e/0x58 - kmalloc_order_trace+0x44/0xc0 - stat_open+0x5a/0xd8 - proc_reg_open+0x8a/0x140 - do_dentry_open+0x1bc/0x2c8 - finish_open+0x46/0x60 - do_last+0x382/0x10d0 - path_openat+0xc8/0x4f8 - do_filp_open+0x46/0xa8 - do_sys_open+0x114/0x1f0 - sysc_tracego+0x14/0x1a - -Signed-off-by: Heiko Carstens -Tested-by: David Rientjes -Cc: Ian Kent -Cc: Hendrik Brueckner -Cc: Thorsten Diehl -Cc: Andrea Righi -Cc: Christoph Hellwig -Cc: Al Viro -Cc: Stefan Bader -Signed-off-by: Andrew Morton -Signed-off-by: Linus Torvalds -Signed-off-by: Greg Kroah-Hartman - ---- - fs/seq_file.c | 30 +++++++++++++++++++++--------- - 1 file changed, 21 insertions(+), 9 deletions(-) - ---- a/fs/seq_file.c -+++ b/fs/seq_file.c -@@ -8,8 +8,10 @@ - #include - #include - #include -+#include - #include - #include -+#include - - #include - #include -@@ -30,6 +32,16 @@ static void seq_set_overflow(struct seq_ - m->count = m->size; - } - -+static void *seq_buf_alloc(unsigned long size) -+{ -+ void *buf; -+ -+ buf = kmalloc(size, GFP_KERNEL | __GFP_NOWARN); -+ if (!buf && size > PAGE_SIZE) -+ buf = vmalloc(size); -+ return buf; -+} -+ - /** - * seq_open - initialize sequential file - * @file: file we initialize -@@ -96,7 +108,7 @@ static int traverse(struct seq_file *m, - return 0; - } - if (!m->buf) { -- m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL); -+ m->buf = seq_buf_alloc(m->size = PAGE_SIZE); - if (!m->buf) - return -ENOMEM; - } -@@ -135,9 +147,9 @@ static int traverse(struct seq_file *m, - - Eoverflow: - m->op->stop(m, p); -- kfree(m->buf); -+ kvfree(m->buf); - m->count = 0; -- m->buf = kmalloc(m->size <<= 1, GFP_KERNEL); -+ m->buf = seq_buf_alloc(m->size <<= 1); - return !m->buf ? -ENOMEM : -EAGAIN; - } - -@@ -192,7 +204,7 @@ ssize_t seq_read(struct file *file, char - - /* grab buffer if we didn't have one */ - if (!m->buf) { -- m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL); -+ m->buf = seq_buf_alloc(m->size = PAGE_SIZE); - if (!m->buf) - goto Enomem; - } -@@ -232,9 +244,9 @@ ssize_t seq_read(struct file *file, char - if (m->count < m->size) - goto Fill; - m->op->stop(m, p); -- kfree(m->buf); -+ kvfree(m->buf); - m->count = 0; -- m->buf = kmalloc(m->size <<= 1, GFP_KERNEL); -+ m->buf = seq_buf_alloc(m->size <<= 1); - if (!m->buf) - goto Enomem; - m->version = 0; -@@ -350,7 +362,7 @@ EXPORT_SYMBOL(seq_lseek); - int seq_release(struct inode *inode, struct file *file) - { - struct seq_file *m = file->private_data; -- kfree(m->buf); -+ kvfree(m->buf); - kfree(m); - return 0; - } -@@ -605,13 +617,13 @@ EXPORT_SYMBOL(single_open); - int single_open_size(struct file *file, int (*show)(struct seq_file *, void *), - void *data, size_t size) - { -- char *buf = kmalloc(size, GFP_KERNEL); -+ char *buf = seq_buf_alloc(size); - int ret; - if (!buf) - return -ENOMEM; - ret = single_open(file, show, data); - if (ret) { -- kfree(buf); -+ kvfree(buf); - return ret; - } - ((struct seq_file *)file->private_data)->buf = buf; diff --git a/queue-3.15/series b/queue-3.15/series index 443b13b7d81..b9d8382f5cb 100644 --- a/queue-3.15/series +++ b/queue-3.15/series @@ -89,7 +89,6 @@ iommu-vt-d-fix-bug-in-handling-multiple-rmrrs-for-the-same-pci-device.patch blkcg-fix-use-after-free-in-__blkg_release_rcu-by-making-blkcg_gq-refcnt-an-atomic_t.patch ext4-fix-buffer-double-free-in-ext4_alloc_branch.patch ext4-fix-hole-punching-for-files-with-indirect-blocks.patch -fs-seq_file-fallback-to-vmalloc-allocation.patch mm-page_alloc-fix-cma-area-initialisation-when-pageblock-max_order.patch zram-revalidate-disk-after-capacity-change.patch proc-stat-convert-to-single_open_size.patch