On Sat, 2012-05-19 at 13:47 +0300, Artem Bityutskiy wrote: > If you walk the list and read pointers, and someone else modifies them, > you may be in trouble. You cannot traverse the list without the > spinlock. And once you dropped the spinlock - you have to start over > because your 'wrk' pointer may point to a non-existing object, because > this object might have been already freed. This is why I added 2 loops. Actually we ourselves free it in ->func() :-) I think it is saner to not even use the list_for_each_entry(), but just take the element off the head, unlock the spinlock use "container_of()", and call ->func(). So we need only one loop, not 2. -- Best Regards, Artem Bityutskiy