• L
    workqueue: split apply_workqueue_attrs() into 3 stages · 2d5f0764
    Lai Jiangshan 提交于
    Current apply_workqueue_attrs() includes pwqs-allocation and pwqs-installation,
    so when we batch multiple apply_workqueue_attrs()s as a transaction, we can't
    ensure the transaction must succeed or fail as a complete unit.
    
    To solve this, we split apply_workqueue_attrs() into three stages.
    The first stage does the preparation: allocation memory, pwqs.
    The second stage does the attrs-installaion and pwqs-installation.
    The third stage frees the allocated memory and (old or unused) pwqs.
    
    As the result, batching multiple apply_workqueue_attrs()s can
    succeed or fail as a complete unit:
    	1) batch do all the first stage for all the workqueues
    	2) only commit all when all the above succeed.
    
    This patch is a preparation for the next patch ("Allow modifying low level
    unbound workqueue cpumask") which will do a multiple apply_workqueue_attrs().
    
    The patch doesn't have functionality changed except two minor adjustment:
    	1) free_unbound_pwq() for the error path is removed, we use the
    	   heavier version put_pwq_unlocked() instead since the error path
    	   is rare. this adjustment simplifies the code.
    	2) the memory-allocation is also moved into wq_pool_mutex.
    	   this is needed to avoid to do the further splitting.
    
    tj: minor updates to comments.
    Suggested-by: NTejun Heo <tj@kernel.org>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: Kevin Hilman <khilman@linaro.org>
    Cc: Lai Jiangshan <laijs@cn.fujitsu.com>
    Cc: Mike Galbraith <bitbucket@online.de>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Viresh Kumar <viresh.kumar@linaro.org>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Signed-off-by: NLai Jiangshan <laijs@cn.fujitsu.com>
    Signed-off-by: NTejun Heo <tj@kernel.org>
    2d5f0764
workqueue.c 142.4 KB