Re: [PATCH 02/13] workqueue: fix work_busy()

Tejun Heo
2013-02-04T19:55:05Z

Hello, Lai.

On Fri, Feb 01, 2013 at 02:41:25AM +0800, Lai Jiangshan wrote:
> diff --git a/kernel/workqueue.c b/kernel/workqueue.c
> index 973b290..d474a6c 100644
> --- a/kernel/workqueue.c
> +++ b/kernel/workqueue.c
> @@ -3443,8 +3443,6 @@ EXPORT_SYMBOL_GPL(workqueue_congested);
> * Test whether @work is currently pending or running. There is no
> * synchronization around this function and the test result is
> * unreliable and only useful as advisory hints or for debugging.
> - * Especially for reentrant wqs, the pending state might hide the
> - * running state.

Yeap, this is no longer true.

> *
> * RETURNS:
> * OR'd bitmask of WORK_BUSY_* bits.
> @@ -3453,15 +3451,13 @@ unsigned int work_busy(struct work_struct *work)
> {
> struct worker_pool *pool = get_work_pool(work);
> unsigned long flags;
> - unsigned int ret = 0;
> + unsigned int ret = work_pending(work) ? WORK_BUSY_PENDING : 0;

I'd prefer this as a if() statement.

> if (!pool)
> - return 0;
> + return ret;

I'm a bit confused. When can we be pending w/o pool?

Thanks.

--
tejun