• Vivek Goyal's avatar
    blkcg: alloc per cpu stats from worker thread in a delayed manner · 1cd9e039
    Vivek Goyal authored
    Current per cpu stat allocation assumes GFP_KERNEL allocation flag. But in
    IO path there are times when we want GFP_NOIO semantics. As there is no
    way to pass the allocation flags to alloc_percpu(), this patch delays the
    allocation of stats using a worker thread.
    v2-> tejun suggested following changes. Changed the patch accordingly.
    	- move alloc_node location in structure
    	- reduce the size of names of some of the fields
    	- Reduce the scope of locking of alloc_list_lock
    	- Simplified stat_alloc_fn() by allocating stats for all
    	  policies in one go and then assigning these to a group.
    v3 -> Andrew suggested to put some comments in the code. Also raised
          concerns about trying to allocate infinitely in case of allocation
          failure. I have changed the logic to sleep for 10ms before retrying.
          That should take care of non-preemptible UP kernels.
    v4 -> Tejun had more suggestions.
    	- drop list_for_each_entry_all()
    	- instead of msleep() use queue_delayed_work()
    	- Some cleanups realted to more compact coding.
    v5-> tejun suggested more cleanups leading to more compact code.
    tj: - Relocated pcpu_stats into blkio_stat_alloc_fn().
        - Minor comment update.
        - This also fixes suspicious RCU usage warning caused by invoking
          cgroup_path() from blkg_alloc() without holding RCU read lock.
          Now that blkg_alloc() doesn't require sleepable context, RCU
          read lock from blkg_lookup_create() is maintained throughout
    Signed-off-by: default avatarVivek Goyal <vgoyal@redhat.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>