Re: [PATCH] workqueue: Fix incorrect error return value in apply_workqueue_attrs_locked
From: Ye Liu
Date: Tue Mar 25 2025 - 01:54:11 EST
在 2025/3/25 13:24, Dan Carpenter 写道:
> On Mon, Mar 24, 2025 at 05:07:48PM +0800, Ye Liu wrote:
> v> From: Ye Liu <liuye@xxxxxxxxxx>
>> Commit 84193c07105c ("workqueue: Generalize unbound CPU pods") introduced
>> a change that caused apply_workqueue_attrs_locked() to return error
>> pointers using PTR_ERR() on failure instead of a negative error code.
> PTR_ERR() does return negative error codes. Unless you pass it a NULL
> pointer, then it returns success. Or if you pass it a valid pointer it
> returns garbage.
I misunderstood PTR_ERR(). Thanks for pointing it out.
>> This caused unexpected behavior in functions that rely on the return value
>> of apply_workqueue_attrs_locked, such as alloc_and_link_pwqs().
>>
>> Specifically, alloc_and_link_pwqs() expects apply_workqueue_attrs_locked()
>> to return 0 on success and a negative error code on failure. However,
>> returning PTR_ERR(ctx) instead of -ENOMEM led to incorrect error handling
>> in __alloc_workqueue, potentially causing system instability or crashes.
>>
>> This patch ensures apply_workqueue_attrs_locked() returns a proper negative
>> error code (-ENOMEM) in case of failure, restoring expected behavior.
>>
>> Fixes: 84193c07105c ("workqueue: Generalize unbound CPU pods")
>> Signed-off-by: Ye Liu <liuye@xxxxxxxxxx>
>> ---
>> kernel/workqueue.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/kernel/workqueue.c b/kernel/workqueue.c
>> index bfe030b443e2..8ba679d9b566 100644
>> --- a/kernel/workqueue.c
>> +++ b/kernel/workqueue.c
>> @@ -5363,7 +5363,7 @@ static int apply_workqueue_attrs_locked(struct workqueue_struct *wq,
>>
>> ctx = apply_wqattrs_prepare(wq, attrs, wq_unbound_cpumask);
>> if (IS_ERR(ctx))
>> - return PTR_ERR(ctx);
>> + return -ENOMEM;
>>
> The original code was correct and the patch is wrong.
Drop it.
> regards,
> dan carpenter
>
Thanks,
Ye Liu