Commit 3931ec21 authored by Lai Jiangshan's avatar Lai Jiangshan Committed by Zeng Heng
Browse files

workqueue: Change arguement of pwq_dec_nr_in_flight()

mainline inclusion
from mainline-v5.15-rc1
commit c4560c2c
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I7LRJF

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c4560c2c88a4c809800ba8e76faabaf80bf6ee89



---------------------------

Make pwq_dec_nr_in_flight() use work_data rather just work_color.

Prepare for later patch to get WORK_STRUCT_INACTIVE bit from work_data
in pwq_dec_nr_in_flight().

No functional change intended.

Signed-off-by: default avatarLai Jiangshan <laijs@linux.alibaba.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarZeng Heng <zengheng4@huawei.com>
parent 5d3eea00
Loading
Loading
Loading
Loading
+10 −8
Original line number Diff line number Diff line
@@ -580,9 +580,9 @@ static unsigned int work_color_to_flags(int color)
	return color << WORK_STRUCT_COLOR_SHIFT;
}

static int get_work_color(struct work_struct *work)
static int get_work_color(unsigned long work_data)
{
	return (*work_data_bits(work) >> WORK_STRUCT_COLOR_SHIFT) &
	return (work_data >> WORK_STRUCT_COLOR_SHIFT) &
		((1 << WORK_STRUCT_COLOR_BITS) - 1);
}

@@ -1169,7 +1169,7 @@ static void pwq_activate_first_inactive(struct pool_workqueue *pwq)
/**
 * pwq_dec_nr_in_flight - decrement pwq's nr_in_flight
 * @pwq: pwq of interest
 * @color: color of work which left the queue
 * @work_data: work_data of work which left the queue
 *
 * A work either has completed or is removed from pending queue,
 * decrement nr_in_flight of its pwq and handle workqueue flushing.
@@ -1177,8 +1177,10 @@ static void pwq_activate_first_inactive(struct pool_workqueue *pwq)
 * CONTEXT:
 * raw_spin_lock_irq(pool->lock).
 */
static void pwq_dec_nr_in_flight(struct pool_workqueue *pwq, int color)
static void pwq_dec_nr_in_flight(struct pool_workqueue *pwq, unsigned long work_data)
{
	int color = get_work_color(work_data);

	/* uncolored work items don't participate in flushing or nr_active */
	if (color == WORK_NO_COLOR)
		goto out_put;
@@ -1301,7 +1303,7 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork,
			pwq_activate_inactive_work(work);

		list_del_init(&work->entry);
		pwq_dec_nr_in_flight(pwq, get_work_color(work));
		pwq_dec_nr_in_flight(pwq, *work_data_bits(work));

		/* work->data points to pwq iff queued, point to pool */
		set_work_pool_and_keep_pending(work, pool->id);
@@ -2177,7 +2179,7 @@ __acquires(&pool->lock)
	struct pool_workqueue *pwq = get_work_pwq(work);
	struct worker_pool *pool = worker->pool;
	bool cpu_intensive = pwq->wq->flags & WQ_CPU_INTENSIVE;
	int work_color;
	unsigned long work_data;
	struct worker *collision;
#ifdef CONFIG_LOCKDEP
	/*
@@ -2213,7 +2215,7 @@ __acquires(&pool->lock)
	worker->current_work = work;
	worker->current_func = work->func;
	worker->current_pwq = pwq;
	work_color = get_work_color(work);
	work_data = *work_data_bits(work);

	/*
	 * Record wq name for cmdline and debug reporting, may get
@@ -2319,7 +2321,7 @@ __acquires(&pool->lock)
	worker->current_work = NULL;
	worker->current_func = NULL;
	worker->current_pwq = NULL;
	pwq_dec_nr_in_flight(pwq, work_color);
	pwq_dec_nr_in_flight(pwq, work_data);
}

/**