Messages in this thread | | | Subject | Re: [PATCH] task_work: return -EBUSY when adding same work | From | Jens Axboe <> | Date | Fri, 9 Jul 2021 08:18:27 -0600 |
| |
On 7/9/21 6:27 AM, yaozhenguo wrote: > when same work is added to task->task_works list one by one, > the list becomes endless loop. So return -EBUSY when this > situation happen. > > Signed-off-by: yaozhenguo <yaozhenguo1@gmail.com> > --- > kernel/task_work.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/kernel/task_work.c b/kernel/task_work.c > index 1698fbe..5061ebf 100644 > --- a/kernel/task_work.c > +++ b/kernel/task_work.c > @@ -27,7 +27,7 @@ > * list is LIFO. > * > * RETURNS: > - * 0 if succeeds or -ESRCH. > + * 0 if succeeds or -ESRCH, -EBUSY. > */ > int task_work_add(struct task_struct *task, struct callback_head *work, > enum task_work_notify_mode notify) > @@ -41,6 +41,8 @@ int task_work_add(struct task_struct *task, struct callback_head *work, > head = READ_ONCE(task->task_works); > if (unlikely(head == &work_exited)) > return -ESRCH; > + if (unlikely(head == work)) > + return -EBUSY; > work->next = head; > } while (cmpxchg(&task->task_works, head, work) != head);
I don't think there's anything conceptually wrong with this patch, but it makes me think that you hit this condition. It's really a bug in the caller, of course, is a WARN_ON_ONCE() warranted here? And who was the caller?
-- Jens Axboe
| |