Skip to content
  • NeilBrown's avatar
    sysfs/kernfs: allow attributes to request write buffer be pre-allocated. · 2b75869b
    NeilBrown authored
    
    
    md/raid allows metadata management to be performed in user-space.
    A various times, particularly on device failure, the metadata needs
    to be updated before further writes can be permitted.
    This means that the user-space program which updates metadata much
    not block on writeout, and so must not allocate memory.
    
    mlockall(MCL_CURRENT|MCL_FUTURE) and pre-allocation can avoid all
    memory allocation issues for user-memory, but that does not help
    kernel memory.
    Several kernel objects can be pre-allocated.  e.g. files opened before
    any writes to the array are permitted.
    However some kernel allocation happens in places that cannot be
    pre-allocated.
    In particular, writes to sysfs files (to tell md that it can now
    allow writes to the array) allocate a buffer using GFP_KERNEL.
    
    This patch allows attributes to be marked as "PREALLOC".  In that case
    the maximal buffer is allocated when the file is opened, and then used
    on each write instead of allocating a new buffer.
    
    As the same buffer is now shared for all writes on the same file
    description, the mutex is extended to cover full use of the buffer
    including the copy_from_user().
    
    The new __ATTR_PREALLOC() 'or's a new flag in to the 'mode', which is
    inspected by sysfs_add_file_mode_ns() to determine if the file should be
    marked as requiring prealloc.
    
    Despite the comment, we *do* use ->seq_show together with ->prealloc
    in this patch.  The next patch fixes that.
    
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    Reviewed-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2b75869b