lkml.org 
[lkml]   [2015]   [May]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 1/5] workqueue: wq_pool_mutex protects the attrs-installation
    On Mon, May 11, 2015 at 05:35:48PM +0800, Lai Jiangshan wrote:
    > @@ -127,6 +127,12 @@ enum {
    > *
    > * PR: wq_pool_mutex protected for writes. Sched-RCU protected for reads.
    > *
    > + * PW: wq_pool_mutex and wq->mutex protected for writes. Any one of them
    > + * protected for reads.

    Either for reads.

    > + *
    > + * PWR: wq_pool_mutex and wq->mutex protected for writes. Any one of them
    > + * or sched-RCU for reads.

    Ditto.

    > + *
    > * WQ: wq->mutex protected.
    > *
    > * WR: wq->mutex protected for writes. Sched-RCU protected for reads.
    ...
    > @@ -553,7 +565,7 @@ static int worker_pool_assign_id(struct worker_pool *pool)
    > * @wq: the target workqueue
    > * @node: the node ID
    > *
    > - * This must be called either with pwq_lock held or sched RCU read locked.
    > + * This must be called either with wq_pool_mutex held or sched RCU read locked.

    The comment was outdated before too but the updated one isn't correct
    either.

    > * If the pwq needs to be used beyond the locking in effect, the caller is
    > * responsible for guaranteeing that the pwq stays online.
    > *
    > @@ -562,7 +574,7 @@ static int worker_pool_assign_id(struct worker_pool *pool)
    > static struct pool_workqueue *unbound_pwq_by_node(struct workqueue_struct *wq,
    > int node)
    > {
    > - assert_rcu_or_wq_mutex(wq);
    > + assert_rcu_or_wq_mutex_or_pool_mutex(wq);
    > return rcu_dereference_raw(wq->numa_pwq_tbl[node]);
    > }
    >
    ...
    > @@ -3644,10 +3657,9 @@ int apply_workqueue_attrs(struct workqueue_struct *wq,
    > * pwqs accordingly.
    > */
    > get_online_cpus();
    > -
    > mutex_lock(&wq_pool_mutex);
    > +
    > ctx = apply_wqattrs_prepare(wq, attrs);
    > - mutex_unlock(&wq_pool_mutex);
    >
    > /* the ctx has been prepared successfully, let's commit it */
    > if (ctx) {
    > @@ -3655,10 +3667,11 @@ int apply_workqueue_attrs(struct workqueue_struct *wq,
    > ret = 0;
    > }
    >
    > - put_online_cpus();
    > -
    > apply_wqattrs_cleanup(ctx);

    Why are we protecting cleanup?

    > + mutex_unlock(&wq_pool_mutex);
    > + put_online_cpus();
    > +
    > return ret;
    > }
    >

    Thanks.

    --
    tejun


    \
     
     \ /
      Last update: 2015-05-11 14:41    [W:4.201 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site