Messages in this thread | | | Subject | Re: lockdep trace from posix timers | From | Peter Zijlstra <> | Date | Mon, 20 Aug 2012 13:50:58 +0200 |
| |
On Mon, 2012-08-20 at 13:44 +0200, Peter Zijlstra wrote: > int > +task_work_add(struct task_struct *task, struct callback_head *work, bool notify) > { > + struct callback_head **head = &task->task_works; > + struct callback_head *entry, *old_entry; > + > + entry = &head;
My compiler just alerted me that:
entry = *head;
works a lot better..
> + for (;;) { > + if (entry == &dead) > + return -ESRCH; > + > + old_entry = entry; > + work->next = entry; > + entry = cmpxchg(head, old_entry, work); > + if (entry == old_entry) > + break; > + } > > /* test_and_set_bit() implies mb(), see tracehook_notify_resume(). */ > if (notify) > set_notify_resume(task); > + > return 0; > }
| |