lkml.org 
[lkml]   [2013]   [Jan]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
Date
Subjectdoes io_cancel always return -EAGAIN?
Is io_cancel implemented by drivers the Linux kernel?

io_cancel depends on kiocb->ki_cancel being set:
- https://github.com/torvalds/linux/blob/v3.7/fs/aio.c#L1734


Seems that ki_cancel is only set by some usb/gadget code:

http://livegrep.com/search?q=ki_cancel

$ git grep ki_cancel
drivers/usb/gadget/inode.c: iocb->ki_cancel = ep_aio_cancel;
fs/aio.c: cancel = iocb->ki_cancel;
fs/aio.c: req->ki_cancel = NULL;
fs/aio.c: req->ki_cancel = NULL;
fs/aio.c: if (kiocb && kiocb->ki_cancel) {
fs/aio.c: cancel = kiocb->ki_cancel;
include/linux/aio.h: int (*ki_cancel)(struct
kiocb *, struct io_event *);




======

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <libaio.h>

int main(int argc, char* argv[]) {
io_context_t ctx;
int fd = open("/proc/self/exe", O_RDONLY);

int rc = io_queue_init(10, &ctx);
if (rc != 0) {
fprintf(stderr, "io_queue_init: %s\n", strerror(-rc));
return 1;
}

struct iocb cb;
struct iocb* pcb = &cb;

char buf[4096];
// read 4K from the start of the file
io_prep_pread(&cb, fd, buf, sizeof(buf), 0);
rc = io_submit(ctx, 1, &pcb);
if (rc != 1) {
fprintf(stderr, "io_submit: %s\n", strerror(-rc));
return 1;
}

io_event event;
rc = io_cancel(ctx, &cb, &event);
if (rc != 0) {
fprintf(stderr, "io_cancel: %s\n", strerror(-rc));
// fall through to show that the read operation was correct
// return 1;
}

rc = io_getevents(ctx, 1, 1, &event, NULL);
if (rc != 1) {
fprintf(stderr, "io_getevents: %s\n", strerror(-rc));
return 1;
}


if (event.obj != &cb) {
fprintf(stderr, "io_getevents: unknown cb\n");
return -1;
}

if (event.res != sizeof(buf)) {
fprintf(stderr, "io_getevents: didn't read all what we requested\n");
return -1;
}

rc = io_queue_release(ctx);
if (rc != 0) {
fprintf(stderr, "io_queue_release: %s\n", strerror(-rc));
return 1;
}
return 0;
}

======


Relevant output from strace:

open("/proc/self/exe", O_RDONLY) = 3
io_setup(10, {140328162443264}) = 0
io_submit(140328162443264, 1, {{(nil), 0, 0, 0, 3}}) = 1
io_cancel(140328162443264, {(nil), 0, 0, 0, 3}, {...}) = -1 EINVAL
(Invalid argument)
write(2, "io_cancel: Invalid argument\n", 28io_cancel: Invalid argument) = 28
io_getevents(140328162443264, 1, 1, {{(nil), 0x7fff41536a60, 4096,
0}}, NULL) = 1
io_destroy(140328162443264) = 0

--
.
..: Lucian


\
 
 \ /
  Last update: 2013-01-17 03:41    [W:0.019 / U:0.280 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site