mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-08 06:36:28 +00:00
Merge pull request #3932 from brauner/2021-08-11.fixes
mainloop: further io_uring fixes
This commit is contained in:
commit
ef10e680d5
@ -28,7 +28,7 @@ struct mainloop_handler {
|
|||||||
void *data;
|
void *data;
|
||||||
lxc_mainloop_callback_t callback;
|
lxc_mainloop_callback_t callback;
|
||||||
lxc_mainloop_cleanup_t cleanup;
|
lxc_mainloop_cleanup_t cleanup;
|
||||||
const char *handler_name;
|
const char *name;
|
||||||
unsigned int flags;
|
unsigned int flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -58,9 +58,9 @@ static int disarm_handler(struct lxc_async_descr *descr,
|
|||||||
}
|
}
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return syswarn_ret(-1, "Failed to disarm %d for \"%s\" handler",
|
return syswarn_ret(-1, "Failed to disarm %d for \"%s\" handler",
|
||||||
handler->fd, handler->handler_name);
|
handler->fd, handler->name);
|
||||||
|
|
||||||
TRACE("Disarmed %d for \"%s\" handler", handler->fd, handler->handler_name);
|
TRACE("Disarmed %d for \"%s\" handler", handler->fd, handler->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,10 +73,10 @@ static void delete_handler(struct mainloop_handler *handler)
|
|||||||
|
|
||||||
ret = handler->cleanup(handler->fd, handler->data);
|
ret = handler->cleanup(handler->fd, handler->data);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
SYSWARN("Failed to cleanup %d for \"%s\" handler", handler->fd, handler->handler_name);
|
SYSWARN("Failed to cleanup %d for \"%s\" handler", handler->fd, handler->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("Deleted %d for \"%s\" handler", handler->fd, handler->handler_name);
|
TRACE("Deleted %d for \"%s\" handler", handler->fd, handler->name);
|
||||||
list = move_ptr(handler->list);
|
list = move_ptr(handler->list);
|
||||||
lxc_list_del(list);
|
lxc_list_del(list);
|
||||||
free(list->elem);
|
free(list->elem);
|
||||||
@ -128,7 +128,7 @@ static inline int __io_uring_open(struct lxc_async_descr *descr)
|
|||||||
if (descr->ring == MAP_FAILED)
|
if (descr->ring == MAP_FAILED)
|
||||||
return syserror("Failed to mmap io_uring memory");
|
return syserror("Failed to mmap io_uring memory");
|
||||||
|
|
||||||
ret = io_uring_queue_init(512, descr->ring, IORING_SETUP_SQPOLL);
|
ret = io_uring_queue_init(512, descr->ring, 0);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
SYSERROR("Failed to initialize io_uring instance");
|
SYSERROR("Failed to initialize io_uring instance");
|
||||||
goto on_error;
|
goto on_error;
|
||||||
@ -190,9 +190,9 @@ static int __io_uring_arm(struct lxc_async_descr *descr,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return syserror_ret(ret, "Failed to add \"%s\" handler", handler->handler_name);
|
return syserror_ret(ret, "Failed to add \"%s\" handler", handler->name);
|
||||||
|
|
||||||
TRACE("Added \"%s\" handler", handler->handler_name);
|
TRACE("Added \"%s\" handler", handler->name);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -212,9 +212,9 @@ static int __io_uring_disarm(struct lxc_async_descr *descr,
|
|||||||
ret = io_uring_submit(descr->ring);
|
ret = io_uring_submit(descr->ring);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return syserror_ret(ret, "Failed to remove \"%s\" handler",
|
return syserror_ret(ret, "Failed to remove \"%s\" handler",
|
||||||
handler->handler_name);
|
handler->name);
|
||||||
|
|
||||||
TRACE("Removed handler \"%s\"", handler->handler_name);
|
TRACE("Removed handler \"%s\"", handler->name);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,26 +261,26 @@ static int __lxc_mainloop_io_uring(struct lxc_async_descr *descr, int timeout_ms
|
|||||||
if (res <= 0) {
|
if (res <= 0) {
|
||||||
switch (res) {
|
switch (res) {
|
||||||
case 0:
|
case 0:
|
||||||
TRACE("Removed \"%s\" handler", handler->handler_name);
|
TRACE("Removed \"%s\" handler", handler->name);
|
||||||
handler->flags |= CANCEL_SUCCESS;
|
handler->flags |= CANCEL_SUCCESS;
|
||||||
if (has_exact_flags(handler->flags, (CANCEL_SUCCESS | CANCEL_RECEIVED)))
|
if (has_exact_flags(handler->flags, (CANCEL_SUCCESS | CANCEL_RECEIVED)))
|
||||||
delete_handler(handler);
|
delete_handler(handler);
|
||||||
break;
|
break;
|
||||||
case -EALREADY:
|
case -EALREADY:
|
||||||
TRACE("Repeat sqe remove request for \"%s\" handler", handler->handler_name);
|
TRACE("Repeat sqe remove request for \"%s\" handler", handler->name);
|
||||||
break;
|
break;
|
||||||
case -ECANCELED:
|
case -ECANCELED:
|
||||||
TRACE("Canceled \"%s\" handler", handler->handler_name);
|
TRACE("Canceled \"%s\" handler", handler->name);
|
||||||
handler->flags |= CANCEL_RECEIVED;
|
handler->flags |= CANCEL_RECEIVED;
|
||||||
if (has_exact_flags(handler->flags, (CANCEL_SUCCESS | CANCEL_RECEIVED)))
|
if (has_exact_flags(handler->flags, (CANCEL_SUCCESS | CANCEL_RECEIVED)))
|
||||||
delete_handler(handler);
|
delete_handler(handler);
|
||||||
break;
|
break;
|
||||||
case -ENOENT:
|
case -ENOENT:
|
||||||
TRACE("No sqe for \"%s\" handler", handler->handler_name);
|
TRACE("No sqe for \"%s\" handler", handler->name);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
WARN("Received unexpected return value %d in cqe for \"%s\" handler",
|
WARN("Received unexpected return value %d in cqe for \"%s\" handler",
|
||||||
res, handler->handler_name);
|
res, handler->name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -292,17 +292,27 @@ static int __lxc_mainloop_io_uring(struct lxc_async_descr *descr, int timeout_ms
|
|||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
case LXC_MAINLOOP_DISARM:
|
case LXC_MAINLOOP_DISARM:
|
||||||
|
/*
|
||||||
|
* If this is a multhishot handler we need to
|
||||||
|
* disarm it here. Actual cleanup happens
|
||||||
|
* later.
|
||||||
|
*/
|
||||||
disarm_handler(descr, handler, oneshot);
|
disarm_handler(descr, handler, oneshot);
|
||||||
|
/*
|
||||||
|
* If this is a oneshot handler we know it has
|
||||||
|
* just run and we also know the above call was
|
||||||
|
* a nop. So clean it up directly.
|
||||||
|
*/
|
||||||
if (oneshot)
|
if (oneshot)
|
||||||
delete_handler(handler);
|
delete_handler(handler);
|
||||||
break;
|
break;
|
||||||
case LXC_MAINLOOP_CLOSE:
|
case LXC_MAINLOOP_CLOSE:
|
||||||
return log_trace(0, "Closing from \"%s\"", handler->handler_name);
|
return log_trace(0, "Closing from \"%s\"", handler->name);
|
||||||
case LXC_MAINLOOP_ERROR:
|
case LXC_MAINLOOP_ERROR:
|
||||||
return syserror_ret(-1, "Closing with error from \"%s\"", handler->handler_name);
|
return syserror_ret(-1, "Closing with error from \"%s\"", handler->name);
|
||||||
default:
|
default:
|
||||||
WARN("Received unexpected return value %d from \"%s\" handler",
|
WARN("Received unexpected return value %d from \"%s\" handler",
|
||||||
ret, handler->handler_name);
|
ret, handler->name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -370,7 +380,7 @@ static int __lxc_mainloop_add_handler_events(struct lxc_async_descr *descr,
|
|||||||
lxc_mainloop_callback_t callback,
|
lxc_mainloop_callback_t callback,
|
||||||
lxc_mainloop_cleanup_t cleanup,
|
lxc_mainloop_cleanup_t cleanup,
|
||||||
void *data, bool oneshot,
|
void *data, bool oneshot,
|
||||||
const char *handler_name)
|
const char *name)
|
||||||
{
|
{
|
||||||
__do_free struct mainloop_handler *handler = NULL;
|
__do_free struct mainloop_handler *handler = NULL;
|
||||||
__do_free struct lxc_list *list = NULL;
|
__do_free struct lxc_list *list = NULL;
|
||||||
@ -380,7 +390,7 @@ static int __lxc_mainloop_add_handler_events(struct lxc_async_descr *descr,
|
|||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return ret_errno(EBADF);
|
return ret_errno(EBADF);
|
||||||
|
|
||||||
if (!callback || !cleanup || !events || !handler_name)
|
if (!callback || !cleanup || !events || !name)
|
||||||
return ret_errno(EINVAL);
|
return ret_errno(EINVAL);
|
||||||
|
|
||||||
handler = zalloc(sizeof(*handler));
|
handler = zalloc(sizeof(*handler));
|
||||||
@ -391,7 +401,7 @@ static int __lxc_mainloop_add_handler_events(struct lxc_async_descr *descr,
|
|||||||
handler->cleanup = cleanup;
|
handler->cleanup = cleanup;
|
||||||
handler->fd = fd;
|
handler->fd = fd;
|
||||||
handler->data = data;
|
handler->data = data;
|
||||||
handler->handler_name = handler_name;
|
handler->name = name;
|
||||||
|
|
||||||
if (descr->type == LXC_MAINLOOP_IO_URING) {
|
if (descr->type == LXC_MAINLOOP_IO_URING) {
|
||||||
ret = __io_uring_arm(descr, handler, oneshot);
|
ret = __io_uring_arm(descr, handler, oneshot);
|
||||||
@ -417,31 +427,31 @@ int lxc_mainloop_add_handler_events(struct lxc_async_descr *descr, int fd,
|
|||||||
int events,
|
int events,
|
||||||
lxc_mainloop_callback_t callback,
|
lxc_mainloop_callback_t callback,
|
||||||
lxc_mainloop_cleanup_t cleanup,
|
lxc_mainloop_cleanup_t cleanup,
|
||||||
void *data, const char *handler_name)
|
void *data, const char *name)
|
||||||
{
|
{
|
||||||
return __lxc_mainloop_add_handler_events(descr, fd, events,
|
return __lxc_mainloop_add_handler_events(descr, fd, events,
|
||||||
callback, cleanup,
|
callback, cleanup,
|
||||||
data, false, handler_name);
|
data, false, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lxc_mainloop_add_handler(struct lxc_async_descr *descr, int fd,
|
int lxc_mainloop_add_handler(struct lxc_async_descr *descr, int fd,
|
||||||
lxc_mainloop_callback_t callback,
|
lxc_mainloop_callback_t callback,
|
||||||
lxc_mainloop_cleanup_t cleanup,
|
lxc_mainloop_cleanup_t cleanup,
|
||||||
void *data, const char *handler_name)
|
void *data, const char *name)
|
||||||
{
|
{
|
||||||
return __lxc_mainloop_add_handler_events(descr, fd, EPOLLIN,
|
return __lxc_mainloop_add_handler_events(descr, fd, EPOLLIN,
|
||||||
callback, cleanup,
|
callback, cleanup,
|
||||||
data, false, handler_name);
|
data, false, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lxc_mainloop_add_oneshot_handler(struct lxc_async_descr *descr, int fd,
|
int lxc_mainloop_add_oneshot_handler(struct lxc_async_descr *descr, int fd,
|
||||||
lxc_mainloop_callback_t callback,
|
lxc_mainloop_callback_t callback,
|
||||||
lxc_mainloop_cleanup_t cleanup,
|
lxc_mainloop_cleanup_t cleanup,
|
||||||
void *data, const char *handler_name)
|
void *data, const char *name)
|
||||||
{
|
{
|
||||||
return __lxc_mainloop_add_handler_events(descr, fd, EPOLLIN,
|
return __lxc_mainloop_add_handler_events(descr, fd, EPOLLIN,
|
||||||
callback, cleanup,
|
callback, cleanup,
|
||||||
data, true, handler_name);
|
data, true, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
int lxc_mainloop_del_handler(struct lxc_async_descr *descr, int fd)
|
int lxc_mainloop_del_handler(struct lxc_async_descr *descr, int fd)
|
||||||
@ -460,7 +470,7 @@ int lxc_mainloop_del_handler(struct lxc_async_descr *descr, int fd)
|
|||||||
else
|
else
|
||||||
ret = epoll_ctl(descr->epfd, EPOLL_CTL_DEL, fd, NULL);
|
ret = epoll_ctl(descr->epfd, EPOLL_CTL_DEL, fd, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return syserror("Failed to disarm \"%s\"", handler->handler_name);
|
return syserror("Failed to disarm \"%s\"", handler->name);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For io_uring the deletion happens at completion time. Either
|
* For io_uring the deletion happens at completion time. Either
|
||||||
|
@ -49,15 +49,15 @@ __hidden extern int lxc_mainloop(struct lxc_async_descr *descr, int timeout_ms);
|
|||||||
__hidden extern int lxc_mainloop_add_handler_events(struct lxc_async_descr *descr, int fd, int events,
|
__hidden extern int lxc_mainloop_add_handler_events(struct lxc_async_descr *descr, int fd, int events,
|
||||||
lxc_mainloop_callback_t callback,
|
lxc_mainloop_callback_t callback,
|
||||||
lxc_mainloop_cleanup_t cleanup,
|
lxc_mainloop_cleanup_t cleanup,
|
||||||
void *data, const char *handler_name);
|
void *data, const char *name);
|
||||||
__hidden extern int lxc_mainloop_add_handler(struct lxc_async_descr *descr, int fd,
|
__hidden extern int lxc_mainloop_add_handler(struct lxc_async_descr *descr, int fd,
|
||||||
lxc_mainloop_callback_t callback,
|
lxc_mainloop_callback_t callback,
|
||||||
lxc_mainloop_cleanup_t cleanup,
|
lxc_mainloop_cleanup_t cleanup,
|
||||||
void *data, const char *handler_name);
|
void *data, const char *name);
|
||||||
__hidden extern int lxc_mainloop_add_oneshot_handler(struct lxc_async_descr *descr, int fd,
|
__hidden extern int lxc_mainloop_add_oneshot_handler(struct lxc_async_descr *descr, int fd,
|
||||||
lxc_mainloop_callback_t callback,
|
lxc_mainloop_callback_t callback,
|
||||||
lxc_mainloop_cleanup_t cleanup,
|
lxc_mainloop_cleanup_t cleanup,
|
||||||
void *data, const char *handler_name);
|
void *data, const char *name);
|
||||||
|
|
||||||
__hidden extern int lxc_mainloop_del_handler(struct lxc_async_descr *descr, int fd);
|
__hidden extern int lxc_mainloop_del_handler(struct lxc_async_descr *descr, int fd);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user