lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 844/862] io_uring/net: dont lose partial send_zc on fail
    Date
    From: Pavel Begunkov <asml.silence@gmail.com>

    [ upstream commit 5693bcce892d7b8b15a7a92b011d3d40a023b53c ]

    Partial zc send may end up in io_req_complete_failed(), which not only
    would return invalid result but also mask out the notification leading
    to lifetime issues.

    Cc: stable@vger.kernel.org
    Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
    Link: https://lore.kernel.org/r/5673285b5e83e6ceca323727b4ddaa584b5cc91e.1663668091.git.asml.silence@gmail.com
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    io_uring/net.c | 16 ++++++++++++++++
    io_uring/net.h | 1 +
    io_uring/opdef.c | 1 +
    3 files changed, 18 insertions(+)

    --- a/io_uring/net.c
    +++ b/io_uring/net.c
    @@ -1093,6 +1093,22 @@ void io_sendrecv_fail(struct io_kiocb *r
    io_req_set_res(req, res, req->cqe.flags);
    }

    +void io_send_zc_fail(struct io_kiocb *req)
    +{
    + struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg);
    + int res = req->cqe.res;
    +
    + if (req->flags & REQ_F_PARTIAL_IO) {
    + if (req->flags & REQ_F_NEED_CLEANUP) {
    + io_notif_flush(sr->notif);
    + sr->notif = NULL;
    + req->flags &= ~REQ_F_NEED_CLEANUP;
    + }
    + res = sr->done_io;
    + }
    + io_req_set_res(req, res, req->cqe.flags);
    +}
    +
    int io_accept_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
    {
    struct io_accept *accept = io_kiocb_to_cmd(req, struct io_accept);
    --- a/io_uring/net.h
    +++ b/io_uring/net.h
    @@ -58,6 +58,7 @@ int io_connect(struct io_kiocb *req, uns
    int io_sendzc(struct io_kiocb *req, unsigned int issue_flags);
    int io_sendzc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
    void io_sendzc_cleanup(struct io_kiocb *req);
    +void io_send_zc_fail(struct io_kiocb *req);

    void io_netmsg_cache_free(struct io_cache_entry *entry);
    #else
    --- a/io_uring/opdef.c
    +++ b/io_uring/opdef.c
    @@ -494,6 +494,7 @@ const struct io_op_def io_op_defs[] = {
    .issue = io_sendzc,
    .prep_async = io_sendzc_prep_async,
    .cleanup = io_sendzc_cleanup,
    + .fail = io_send_zc_fail,
    #else
    .prep = io_eopnotsupp_prep,
    #endif

    \
     
     \ /
      Last update: 2022-10-19 12:38    [W:3.866 / U:0.208 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site