All of lore.kernel.org
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Jens Axboe <axboe@kernel.dk>,
	Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com>,
	Sasha Levin <sashal@kernel.org>
Subject: [PATCH 5.6 20/43] io_uring: reset -EBUSY error when io sq thread is waken up
Date: Fri,  5 Jun 2020 16:14:50 +0200	[thread overview]
Message-ID: <20200605140153.581180425@linuxfoundation.org> (raw)
In-Reply-To: <20200605140152.493743366@linuxfoundation.org>

From: Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com>

[ Upstream commit d4ae271dfaae2a5f41c015f2f20d62a1deeec734 ]

In io_sq_thread(), currently if we get an -EBUSY error and go to sleep,
we will won't clear it again, which will result in io_sq_thread() will
never have a chance to submit sqes again. Below test program test.c
can reveal this bug:

int main(int argc, char *argv[])
{
        struct io_uring ring;
        int i, fd, ret;
        struct io_uring_sqe *sqe;
        struct io_uring_cqe *cqe;
        struct iovec *iovecs;
        void *buf;
        struct io_uring_params p;

        if (argc < 2) {
                printf("%s: file\n", argv[0]);
                return 1;
        }

        memset(&p, 0, sizeof(p));
        p.flags = IORING_SETUP_SQPOLL;
        ret = io_uring_queue_init_params(4, &ring, &p);
        if (ret < 0) {
                fprintf(stderr, "queue_init: %s\n", strerror(-ret));
                return 1;
        }

        fd = open(argv[1], O_RDONLY | O_DIRECT);
        if (fd < 0) {
                perror("open");
                return 1;
        }

        iovecs = calloc(10, sizeof(struct iovec));
        for (i = 0; i < 10; i++) {
                if (posix_memalign(&buf, 4096, 4096))
                        return 1;
                iovecs[i].iov_base = buf;
                iovecs[i].iov_len = 4096;
        }

        ret = io_uring_register_files(&ring, &fd, 1);
        if (ret < 0) {
                fprintf(stderr, "%s: register %d\n", __FUNCTION__, ret);
                return ret;
        }

        for (i = 0; i < 10; i++) {
                sqe = io_uring_get_sqe(&ring);
                if (!sqe)
                        break;

                io_uring_prep_readv(sqe, 0, &iovecs[i], 1, 0);
                sqe->flags |= IOSQE_FIXED_FILE;

                ret = io_uring_submit(&ring);
                sleep(1);
                printf("submit %d\n", i);
        }

        for (i = 0; i < 10; i++) {
                io_uring_wait_cqe(&ring, &cqe);
                printf("receive: %d\n", i);
                if (cqe->res != 4096) {
                        fprintf(stderr, "ret=%d, wanted 4096\n", cqe->res);
                        ret = 1;
                }
                io_uring_cqe_seen(&ring, cqe);
        }

        close(fd);
        io_uring_queue_exit(&ring);
        return 0;
}
sudo ./test testfile
above command will hang on the tenth request, to fix this bug, when io
sq_thread is waken up, we reset the variable 'ret' to be zero.

Suggested-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Xiaoguang Wang <xiaoguang.wang@linux.alibaba.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 fs/io_uring.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/fs/io_uring.c b/fs/io_uring.c
index 504484dc33e4..c6e1f76a6ee0 100644
--- a/fs/io_uring.c
+++ b/fs/io_uring.c
@@ -5224,6 +5224,7 @@ static int io_sq_thread(void *data)
 				finish_wait(&ctx->sqo_wait, &wait);
 
 				ctx->rings->sq_flags &= ~IORING_SQ_NEED_WAKEUP;
+				ret = 0;
 				continue;
 			}
 			finish_wait(&ctx->sqo_wait, &wait);
-- 
2.25.1




  parent reply	other threads:[~2020-06-05 14:25 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-05 14:14 [PATCH 5.6 00/43] 5.6.17-rc1 review Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 01/43] x86/syscalls: Revert "x86/syscalls: Make __X32_SYSCALL_BIT be unsigned long" Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 02/43] Revert "cgroup: Add memory barriers to plug cgroup_rstat_updated() race window" Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 03/43] ARC: Fix ICCM & DCCM runtime size checks Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 04/43] ARC: [plat-eznps]: Restrict to CONFIG_ISA_ARCOMPACT Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 05/43] efi/libstub: Avoid returning uninitialized data from setup_graphics() Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 06/43] evm: Fix RCU list related warnings Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 07/43] scsi: pm: Balance pm_only counter of request queue during system resume Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 08/43] efi/earlycon: Fix early printk for wider fonts Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 09/43] x86/hyperv: Properly suspend/resume reenlightenment notifications Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 10/43] dmaengine: ti: k3-udma: Fix TR mode flags for slave_sg and memcpy Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 11/43] i2c: altera: Fix race between xfer_msg and isr thread Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 12/43] io_uring: initialize ctx->sqo_wait earlier Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 13/43] io_uring: dont prepare DRAIN reqs twice Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 14/43] io_uring: fix FORCE_ASYNC req preparation Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 15/43] net: phy: propagate an error back to the callers of phy_sfp_probe Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 16/43] x86/mmiotrace: Use cpumask_available() for cpumask_var_t variables Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 17/43] net: bmac: Fix read of MAC address from ROM Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 18/43] drm/edid: Add Oculus Rift S to non-desktop list Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 19/43] s390/mm: fix set_huge_pte_at() for empty ptes Greg Kroah-Hartman
2020-06-05 14:14 ` Greg Kroah-Hartman [this message]
2020-06-05 14:14 ` [PATCH 5.6 21/43] drm/amd/display: DP training to set properly SCRAMBLING_DISABLE Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 22/43] riscv: Fix print_vm_layout build error if NOMMU Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 23/43] wireguard: selftests: use newer iproute2 for gcc-10 Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 24/43] null_blk: return error for invalid zone size Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 25/43] net: ethernet: ti: fix some return value check of cpsw_ale_create() Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 26/43] net/ethernet/freescale: rework quiesce/activate for ucc_geth Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 27/43] net: ethernet: stmmac: Enable interface clocks on probe for IPQ806x Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 28/43] selftests: mlxsw: qos_mc_aware: Specify arping timeout as an integer Greg Kroah-Hartman
2020-06-05 14:14 ` [PATCH 5.6 29/43] net: Fix return value about devm_platform_ioremap_resource() Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 30/43] net: smsc911x: Fix runtime PM imbalance on error Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 31/43] mm: Fix mremap not considering huge pmd devmap Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 32/43] HID: sony: Fix for broken buttons on DS3 USB dongles Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 33/43] HID: multitouch: enable multi-input as a quirk for some devices Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 34/43] HID: i2c-hid: add Schneider SCL142ALM to descriptor override Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 35/43] p54usb: add AirVasT USB stick device-id Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 36/43] mt76: mt76x02u: Add support for newer versions of the XBox One wifi adapter Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 37/43] crypto: api - Fix use-after-free and race in crypto_spawn_alg Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 38/43] kernel/relay.c: handle alloc_percpu returning NULL in relay_open Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 39/43] mmc: fix compilation of user API Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 40/43] media: Revert "staging: imgu: Address a compiler warning on alignment" Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 41/43] media: staging: ipu3-imgu: Move alignment attribute to field Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 42/43] net: dsa: mt7530: set CPU port to fallback mode Greg Kroah-Hartman
2020-06-05 14:15 ` [PATCH 5.6 43/43] airo: Fix read overflows sending packets Greg Kroah-Hartman
2020-06-05 15:30 ` [PATCH 5.6 00/43] 5.6.17-rc1 review Shuah Khan
2020-06-05 15:48   ` Greg Kroah-Hartman
2020-06-05 22:13 ` Shuah Khan
     [not found] ` <20200605140152.493743366-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>
2020-06-06  6:27   ` Jon Hunter
2020-06-06  6:27     ` Jon Hunter
2020-06-06 13:34 ` Guenter Roeck
2020-06-06 16:12 ` Naresh Kamboju

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200605140153.581180425@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=axboe@kernel.dk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=xiaoguang.wang@linux.alibaba.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.