From: Greg Kroah-Hartman Date: Wed, 3 Apr 2024 14:29:22 +0000 (+0200) Subject: Revert "workqueue: Replace pwq_activate_inactive_work() with [__]pwq_activate_work()" X-Git-Tag: v6.8.4~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c2f420eb270bc718a73c669d4655d5aabcec4c9e;p=thirdparty%2Fkernel%2Fstable.git Revert "workqueue: Replace pwq_activate_inactive_work() with [__]pwq_activate_work()" This reverts commit f4505c2033ad25839f6fd9be6fc474b8306c44eb which is commit 4c6380305d21e36581b451f7337a36c93b64e050 upstream. The workqueue patches backported to 6.8.y caused some reported regressions, so revert them for now. Reported-by: Thorsten Leemhuis Cc: Tejun Heo Cc: Marek Szyprowski Cc: Nathan Chancellor Cc: Sasha Levin Cc: Audra Mitchell Link: https://lore.kernel.org/all/ce4c2f67-c298-48a0-87a3-f933d646c73b@leemhuis.info/ Signed-off-by: Greg Kroah-Hartman --- diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 7e1b0238158ea..6d0f64b5918ba 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -1461,36 +1461,16 @@ static bool pwq_is_empty(struct pool_workqueue *pwq) return !pwq->nr_active && list_empty(&pwq->inactive_works); } -static void __pwq_activate_work(struct pool_workqueue *pwq, - struct work_struct *work) +static void pwq_activate_inactive_work(struct work_struct *work) { + struct pool_workqueue *pwq = get_work_pwq(work); + trace_workqueue_activate_work(work); if (list_empty(&pwq->pool->worklist)) pwq->pool->watchdog_ts = jiffies; move_linked_works(work, &pwq->pool->worklist, NULL); __clear_bit(WORK_STRUCT_INACTIVE_BIT, work_data_bits(work)); -} - -/** - * pwq_activate_work - Activate a work item if inactive - * @pwq: pool_workqueue @work belongs to - * @work: work item to activate - * - * Returns %true if activated. %false if already active. - */ -static bool pwq_activate_work(struct pool_workqueue *pwq, - struct work_struct *work) -{ - struct worker_pool *pool = pwq->pool; - - lockdep_assert_held(&pool->lock); - - if (!(*work_data_bits(work) & WORK_STRUCT_INACTIVE)) - return false; - pwq->nr_active++; - __pwq_activate_work(pwq, work); - return true; } static void pwq_activate_first_inactive(struct pool_workqueue *pwq) @@ -1498,7 +1478,7 @@ static void pwq_activate_first_inactive(struct pool_workqueue *pwq) struct work_struct *work = list_first_entry(&pwq->inactive_works, struct work_struct, entry); - pwq_activate_work(pwq, work); + pwq_activate_inactive_work(work); } /** @@ -1636,7 +1616,8 @@ static int try_to_grab_pending(struct work_struct *work, bool is_dwork, * management later on and cause stall. Make sure the work * item is activated before grabbing. */ - pwq_activate_work(pwq, work); + if (*work_data_bits(work) & WORK_STRUCT_INACTIVE) + pwq_activate_inactive_work(work); list_del_init(&work->entry); pwq_dec_nr_in_flight(pwq, *work_data_bits(work));