Re: [take33 10/10] kevent: Kevent based AIO (aio_sendfile()/aio_sendfile_path()).

2007-01-18 Thread Suparna Bhattacharya
On Wed, Jan 17, 2007 at 05:39:51PM +0300, Evgeniy Polyakov wrote: > On Wed, Jan 17, 2007 at 07:21:42PM +0530, Suparna Bhattacharya ([EMAIL > PROTECTED]) wrote: > > > > Since you are implementing new APIs here, have you considered doing an > > aio_sendfilev to be able t

Re: [take33 10/10] kevent: Kevent based AIO (aio_sendfile()/aio_sendfile_path()).

2007-01-17 Thread Suparna Bhattacharya
largefile()) > + flags = O_LARGEFILE; > + > + if (IS_ERR(tmp)) { > + err = fd; > + goto err_out_exit; > + } > + > + fd = get_unused_fd(); > + if (fd < 0) { > + err = fd; > + goto err_out_put_name; > + } > + > + if ((flags+1) & O_ACCMODE) > + flags++; > + > + err = open_namei(AT_FDCWD, tmp, flags, 0400, &nd); > + if (err) > + goto err_out_fdput; > + > + file = nameidata_to_filp(&nd, flags); > + if (!file) > + goto err_out_fdput; > + > + /* One reference will be released in sys_close(), > + * second one through req->destructor() > + */ > + atomic_inc(&file->f_count); > + > + req = kaio_sendfile(kevent_fd, sock_fd, file, offset, count); > + if (!req) { > + err = -EINVAL; > + goto err_out_fput; > + } > + > + fd_install(fd, file); > + > + return fd; > + > +err_out_fput: > + fput(file); > + fput(file); > +err_out_fdput: > + put_unused_fd(fd); > +err_out_put_name: > + putname(tmp); > +err_out_exit: > + return err; > +} > + > +static int kevent_aio_callback(struct kevent *k) > +{ > + struct kaio_req *req = k->event.ptr; > + struct kaio_private *priv = req->priv; > + > + if (!priv->count) { > + __u32 *processed = (__u32 *)&priv->processed; > + k->event.ret_data[0] = processed[0]; > + k->event.ret_data[1] = processed[1]; > + return 1; > + } > + > + return 0; > +} > + > +int kevent_aio_enqueue(struct kevent *k) > +{ > + int err; > + struct kaio_req *req = k->event.ptr; > + struct kaio_private *priv = req->priv; > + > + err = kevent_storage_enqueue(&k->user->st, k); > + if (err) > + goto err_out_exit; > + > + priv->kevent_user = k->user; > + if (k->event.req_flags & KEVENT_REQ_ALWAYS_QUEUE) > + kevent_requeue(k); > + > + return 0; > + > +err_out_exit: > + return err; > +} > + > +int kevent_aio_dequeue(struct kevent *k) > +{ > + kevent_storage_dequeue(k->st, k); > + > + return 0; > +} > + > +static void kaio_thread_stop(struct kaio_thread *th) > +{ > + kthread_stop(th->thread); > + kfree(th); > +} > + > +static int kaio_thread_start(struct kaio_thread **thp, int num) > +{ > + struct kaio_thread *th; > + > + th = kzalloc(sizeof(struct kaio_thread), GFP_KERNEL); > + if (!th) > + return -ENOMEM; > + > + th->refcnt = 1; > + spin_lock_init(&th->req_lock); > + INIT_LIST_HEAD(&th->req_list); > + init_waitqueue_head(&th->wait); > + > + th->thread = kthread_run(kaio_thread_process, th, "kaio/%d", num); > + if (IS_ERR(th->thread)) { > + int err = PTR_ERR(th->thread); > + kfree(th); > + return err; > + } > + > + *thp = th; > + wmb(); > + > + return 0; > +} > + > +static int __init kevent_init_aio(void) > +{ > + struct kevent_callbacks sc = { > + .callback = &kevent_aio_callback, > + .enqueue = &kevent_aio_enqueue, > + .dequeue = &kevent_aio_dequeue, > + .flags = 0, > + }; > + int err, i; > + > + kaio_req_cache = kmem_cache_create("kaio_req", sizeof(struct kaio_req), > + 0, SLAB_PANIC, NULL, NULL); > + kaio_priv_cache = kmem_cache_create("kaio_priv", sizeof(struct > kaio_private), > + 0, SLAB_PANIC, NULL, NULL); > + > + memset(kaio_threads, 0, sizeof(kaio_threads)); > + > + for (i=0; i + err = kaio_thread_start(&kaio_threads[i], i); > + if (err) > + goto err_out_stop; > + } > + > + err = kevent_add_callbacks(&sc, KEVENT_AIO); > + if (err) > + goto err_out_stop; > + > + return 0; > + > +err_out_stop: > + while (--i >= 0) { > + struct kaio_thread *th = kaio_threads[i]; > + > + kaio_threads[i] = NULL; > + wmb(); > + > + kaio_thread_stop(th); > + } > + return err; > +} > +module_init(kevent_init_aio); > > - > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to [EMAIL PROTECTED] > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Suparna Bhattacharya ([EMAIL PROTECTED]) Linux Technology Center IBM Software Lab, India - To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html

Re: Kernel patches enabling better POSIX AIO (Was Re: [3/4] kevent: AIO, aio_sendfile)

2006-08-14 Thread Suparna Bhattacharya
On Sat, Aug 12, 2006 at 12:10:35PM -0700, Ulrich Drepper wrote: > Suparna Bhattacharya wrote: > > I am wondering about that too. IIRC, the IO_NOTIFY_* constants are not > > part of the ABI, but only internal to the kernel implementation. I think > > Zach had suggeste

Kernel patches enabling better POSIX AIO (Was Re: [3/4] kevent: AIO, aio_sendfile)

2006-08-12 Thread Suparna Bhattacharya
nd then in the end the lio_listio > completion? I think Suparna wrote this is the case but I want to make sure. Sebestian, could you confirm ? > > > Overall, this looks much better than the old code. If the answers to my > questions show that the behavior is compatible with the

Re: [3/4] kevent: AIO, aio_sendfile() implementation.

2006-07-31 Thread Suparna Bhattacharya
to lio_listio). Now should the at least NENT check apply only to LIO_WAIT or also to the LIO_NOWAIT notification case ? BTW, the native io_getevents does support a min_nr wakeup already, except that it applies to any iocb on the io_context, and not just a given lio_listio call. Regards Suparna --