FreeBSD disk AIO support
Igor Sysoev
is at rambler-co.ru
Mon Aug 24 19:15:28 MSD 2009
On Mon, Aug 24, 2009 at 06:42:14PM +0400, Andrei Nigmatulin wrote:
> On Monday 24 August 2009 13:27, Igor Sysoev wrote:
> > On Mon, Aug 24, 2009 at 04:57:36AM +0400, Andrei Nigmatulin wrote:
> > > On Monday 24 August 2009 04:35, Andrei Nigmatulin wrote:
> > > > On Monday 24 August 2009 02:23, Andrei Nigmatulin wrote:
> > > > > On Monday 24 August 2009 01:13, Igor Sysoev wrote:
> > > > > > /usr/include/libaio.h:
> > > > > >
> > > > > > struct iocb {
> > > > > > PADDEDptr(void *data, __pad1); /* Return in the io
> > > > > > completion event */ PADDED(unsigned key, __pad2); /* For use in
> > > > > > identifying io requests */
> > > > > >
> > > > > > short aio_lio_opcode;
> > > > > > short aio_reqprio;
> > > > > > int aio_fildes;
> > > > > >
> > > > > > union {
> > > > > > struct io_iocb_common c;
> > > > > > ...
> > > > > >
> > > > > > struct io_iocb_common {
> > > > > > PADDEDptr(void *buf, __pad1);
> > > > > > PADDEDul(nbytes, __pad2);
> > > > > > long long offset;
> > > > > > long long __pad3, __pad4;
> > > > > > }; /* result code is the amount read or -'ve errno */
> > > > > >
> > > > > >
> > > > > > Полей .aio_flags и .aio_resfd в struct iocb нет. Ну и как это
> > > > > > собирать ?
> > > > >
> > > > > А если
> > > > >
> > > > > -#include <libaio.h>
> > > > > +#include <linux/aio_abi.h>
> > > > >
> > > > > ?
> > > >
> > > > Похоже, что libaio >= 0.3.107 имеет поддержку eventfd (патч добавил
> > > > Rusty Russell) и искомые поля есть в io_iocb_common.
> > >
> > > Имхо, есть смысл делать в обход libaio, напрямую. Статус библиотеки
> > > непонятен, домашней страницы я не нашел, необходимая для eventfd версия
> > > >= 0.3.107 есть далеко не во всех дистрибутивах.
> > >
> > > Зато нашел пример как можно использовать io_submit/io_getevents напрямую
> > > без libaio, с использованием linux/aio_abi.h:
> > >
> > > http://www.xmailserver.org/eventfd-aio-test.c
> > >
> > > Туда надо добавить:
> > >
> > > #include <linux/aio_abi.h>
> > > #include <sys/eventfd.h>
> > >
> > > И немного почистить.
> >
> > Пока в io_iocb_common не появятся .aio_flags и .aio_resfd, буду делать так:
> >
> > #include <libaio.h>
> >
> > uint32_t *p = (uint32_t *) &iocb.c.__pad4;
> > p[0] = flags;
> > p[1] = fd;
>
> По идее, будет работать. А почему ты не хочешь напрямую без libaio ? Сама
> библиотека, по сути ничего не делает, там просто врапперы io_* -> syscall.
Да, скорее всего, придётся делать без libaio.
--
Игорь Сысоев
http://sysoev.ru
More information about the nginx-ru
mailing list