Mathieu Desnoyers <mathieu.desnoy...@efficios.com> wrote: > Ported to the Linux kernel from Userspace RCU library, at commit > 108a92e5b97ee91b2b902dba2dd2e78aab42f420. > > Ref: http://git.lttng.org/userspace-rcu.git > > It is provided as a starting point only. Test cases should be ported > from Userspace RCU to kernel space and thoroughly ran on a wide range of > architectures before considering this port production-ready.
Thanks, this seems to work. Will post an early epoll patch in a minute. Minor comments below. > +/* > + * Load a data from shared memory. > + */ > +#define CMM_LOAD_SHARED(p) ACCESS_ONCE(p) When iterating through the queue by dequeueing, I needed a way to get the tail at the start of the iteration and use that as a sentinel while iterating, so I access the tail like this: struct wfcq_node *p = CMM_LOAD_SHARED(ep->rdltail.p); I hope this is supported... it seems to work :) Unlike most queue users, I need to stop iteration to prevent the same item from appearing in the events returned by epoll_wait; since a dequeued item may appear back in the wfcqueue immediately. > +struct wfcq_head { > + struct wfcq_node node; > + struct mutex lock; > +}; I'm not using this lock at all since I already have ep->mtx (which also protects the ep->rbr). Perhaps it should not be included; normal linked list and most data structures I see in the kernel do not provide their own locks, either > +static inline void wfcq_init(struct wfcq_head *head, > + struct wfcq_tail *tail) > +{ > + /* Set queue head and tail */ > + wfcq_node_init(&head->node); > + tail->p = &head->node; > + mutex_init(&head->lock); > +} There's no corresponding mutex_destroy, so I'm just destroying it myself... -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/