• Heiko Carstens's avatar
    fs/seq_file: fallback to vmalloc allocation · 058504ed
    Heiko Carstens authored
    
    
    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: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
    Tested-by: default avatarDavid Rientjes <rientjes@google.com>
    Cc: Ian Kent <raven@themaw.net>
    Cc: Hendrik Brueckner <brueckner@linux.vnet.ibm.com>
    Cc: Thorsten Diehl <thorsten.diehl@de.ibm.com>
    Cc: Andrea Righi <andrea@betterlinux.com>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Stefan Bader <stefan.bader@canonical.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    058504ed
seq_file.c 21.9 KB