What is the testing status of this?
Have any real-life applications been converted?
Does it require libaio changes to test?
>
> +int async_poll(struct kiocb *iocb, int events);
> +
growl. Please don't put function prototypes in .c files. It defeats
typechecking. I've moved this to aio.h.
> +int async_poll(struct kiocb *iocb, int events)
> +{
> + unsigned int mask;
> + struct async_poll_iocb *apiocb = kiocb_to_apiocb(iocb);
> +
> + /* Fast path */
> + if (iocb->ki_filp->f_op && iocb->ki_filp->f_op->poll) {
> + mask = iocb->ki_filp->f_op->poll(iocb->ki_filp, NULL);
> + mask &= events | POLLERR | POLLHUP;
> + if (mask & events)
> + return events;
> + }
> +
> + init_poll_funcptr(&apiocb->pt, async_poll_queue_proc);
> + apiocb->armed = &apiocb;
> + apiocb->outofmem = 0;
> + apiocb->events = events;
> + apiocb->ehead = NULL;
> +
> + iocb->ki_users++;
There is no locking around this modification of ->ki_users. Is this
correct?
> + wmb();
Barriers always need comments explaining why they are there.
> +
> + mask = DEFAULT_POLLMASK;
> + if (iocb->ki_filp->f_op && iocb->ki_filp->f_op->poll)
> + mask = iocb->ki_filp->f_op->poll(iocb->ki_filp, &apiocb->pt);
> + mask &= events | POLLERR | POLLHUP;
> + if (mask && xchg(&apiocb->armed, NULL)) {
> + async_poll_freewait(apiocb, NULL);
> + aio_complete(iocb, mask, 0);
> + }
> + if (unlikely(apiocb->outofmem) && xchg(&apiocb->armed, NULL)) {
> + async_poll_freewait(apiocb, NULL);
> + aio_put_req(iocb);
> + aio_put_req(iocb);
Is the double-put intentional?
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/