Il 13/08/2013 09:56, Jan Kiszka ha scritto: > Hi Stefan, > > in the attempt to use Alex' ppoll-based timer rework for decoupled, > real-time capable timer device models I'm now scratching my head over > the aio_poll interface. I'm looking at dataplane/virtio-blk.c, just finding > > static void *data_plane_thread(void *opaque) > { > VirtIOBlockDataPlane *s = opaque; > > do { > aio_poll(s->ctx, true); > } while (!s->stopping || s->num_reqs > 0); > return NULL; > } > > wondering where the locking is. Or doesn't this use need any at all? Are > all data structures that this thread accesses exclusively used by it, or > are they all accessed in a lock-less way?
There is some locking in aio_bh_poll. It is pretty lightweight because adding elements and deleting them is done under a lock, while the list is walked without taking it (because deletion is only done by the thread that walks). We could do something similar for file descriptors; timers are more complicated because insertions happen for every mod_timer. Using an AioContext lock for timers is somewhat complicated for lock ordering, because context A could try to modify a timer from context B, at the same time when context B is modifying a timer from context A. This would cause a deadlock. So I agree with Stefan's usage of a finer-grain lock for timer lists. Paolo