Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp2036139ybv; Fri, 21 Feb 2020 07:45:01 -0800 (PST) X-Google-Smtp-Source: APXvYqw6mU10wzslz9p0ITAf+psEbyOvEmRezjCSHX8meCmxVIMTYGOkVq4DP6Oxy4n+G0RuZjgJ X-Received: by 2002:aca:5746:: with SMTP id l67mr2514473oib.60.1582299901199; Fri, 21 Feb 2020 07:45:01 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582299901; cv=none; d=google.com; s=arc-20160816; b=okAPspwrqgS1zHVew/z6uAAn5HlDEbdEJCEidlegsvChjstSuDM8pUUdxI+cOU8tc/ dUqURS28r+cyDpUO4yDD8tST8QppC3LmY9djrCQ53H54kb6vVbLebMM4g1cIlS5zhhs4 sgVjCxxcZNf4zVk0xQp1rJybdStuLhNEAxoy75/NLmAe9vDfLIyrI8aAyHInrFQEQhLs EHnkZT8PWZ7AWf1VskILKadhFYYNpATEUBl1VIW1BVZ8JQCzf/+yKLmCaQbGFoGFAN8q QuJz0e6L+NRvdOi1LfXdQFjRKUohROW814oHjlmmcWTseE9i9S/V5x1owbfM7FdymHnJ 89ag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=au5w5k7HxBHqjH5cZQKFsvOJIbXWXe9r1KGkl1Ke4uY=; b=zCaDl4FmPTus6kMRTGxGFbN3Voop5l7lIkdkCF+kywr6nfqTxHBNjY/IS0LAkfTC+d nFklES9vTvK14XFu9gLPHpqmFPIKPHZiRJ5O9aichV7xgWwLCjlza6LB6Z3HZXusdd5b yk9fUrlaS/Lu874DSIzoAMSLoiapn7j/R/U7I2wfu3gppMiqkVN+yrJQy4Ze0Wfx1t+u ms0uyfFcKgGkEl5yet2YoY0pnom1thC1D6i7CskdU4uZ78PDN01DdDqhEei8tBx0cq1d Tt1PlC+5dczOtBPuslAKPPNHAZvhpdlHFBI+Dxzajjt1ROIEmIQfPUnZjnjW2EjJabvv /GsQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=W901Intc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id t26si1487808otq.264.2020.02.21.07.44.48; Fri, 21 Feb 2020 07:45:01 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=W901Intc; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729155AbgBUPoH (ORCPT + 99 others); Fri, 21 Feb 2020 10:44:07 -0500 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:55277 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728235AbgBUPoG (ORCPT ); Fri, 21 Feb 2020 10:44:06 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1582299845; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=au5w5k7HxBHqjH5cZQKFsvOJIbXWXe9r1KGkl1Ke4uY=; b=W901IntcAt51t/z4q6CrVKFAuDaBT1M/TxItx7c6HugoHX2626H9SgwHY7+HfylYIVRV3/ Kw+3r8MOJhDcX3i+Pa34GbJlhGOERXtQPOj3zEIGzriqNazD9y1vG/Gr+ki5DCSXKoe9W0 dBEQ5RUMzED8wap9x06ICdAKDjXcakI= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-409-Yt3bO1aLO7SGUS3-ezkQ6g-1; Fri, 21 Feb 2020 10:44:04 -0500 X-MC-Unique: Yt3bO1aLO7SGUS3-ezkQ6g-1 Received: by mail-wm1-f70.google.com with SMTP id d4so732915wmd.7 for ; Fri, 21 Feb 2020 07:44:03 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=au5w5k7HxBHqjH5cZQKFsvOJIbXWXe9r1KGkl1Ke4uY=; b=PRrVV2iqJvHlo919On1ZGq/2oWvsESFUnhUOu80nLPvkaTwTjIWUPtymbdN27xMmUl fnJbmmy/ceTmJ7PVR+B6Vx/suhNTSS0gj5bU2Gmk7bwcgrz4CTVML/9SKsvty8lWSiTh mFhXf34ELm/mTHi5PEjW+rgKe3PHWMtU3JB0xOmouWANQ1yhTT5Hvdn/kNDemmN6rgcM M/t8ojXtxJ2bLxs9bb6xv9Hj2tqwAtcU9oLNAd0IFSqJu08AQx6j3kjrOGfqPIKH7Db5 6JVhY3E2UmklehNhdlA42IrcV8uSRtk2+d2m7e+8OZIhOUKlsQUspN2dR9Hn4s2Q39BA D+iQ== X-Gm-Message-State: APjAAAWIMqZzP59Ti49xIVEodcjT6ca+2cqV35rtrV2JqrAQW2F7vsFS N+vZFC09bcu56rwpeBzsc60RFN5aaIw4PYLdOBL1EYey7DXqBhKGHMNKOuErK3AR0kAtH1nV+RN CLmljnala2KrBxgDAds1HpT/c X-Received: by 2002:adf:cd92:: with SMTP id q18mr48502653wrj.261.1582299842704; Fri, 21 Feb 2020 07:44:02 -0800 (PST) X-Received: by 2002:adf:cd92:: with SMTP id q18mr48502636wrj.261.1582299842449; Fri, 21 Feb 2020 07:44:02 -0800 (PST) Received: from steredhat.redhat.com (host209-4-dynamic.27-79-r.retail.telecomitalia.it. [79.27.4.209]) by smtp.gmail.com with ESMTPSA id s1sm4297072wro.66.2020.02.21.07.44.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 21 Feb 2020 07:44:01 -0800 (PST) From: Stefano Garzarella To: Jens Axboe Cc: io-uring@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH liburing] test: add sq-poll-kthread test case Date: Fri, 21 Feb 2020 16:44:00 +0100 Message-Id: <20200221154400.207213-1-sgarzare@redhat.com> X-Mailer: git-send-email 2.24.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org sq-poll-kthread tests if the 'io_uring-sq' kthread is stopped when the userspace process ended with or without closing the io_uring fd. Signed-off-by: Stefano Garzarella --- .gitignore | 1 + test/Makefile | 4 +- test/sq-poll-kthread.c | 165 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 168 insertions(+), 2 deletions(-) create mode 100644 test/sq-poll-kthread.c diff --git a/.gitignore b/.gitignore index 1ab4075..9f85a5f 100644 --- a/.gitignore +++ b/.gitignore @@ -75,6 +75,7 @@ /test/short-read /test/socket-rw /test/sq-full +/test/sq-poll-kthread /test/sq-space_left /test/statx /test/stdout diff --git a/test/Makefile b/test/Makefile index cf91011..09c7aa2 100644 --- a/test/Makefile +++ b/test/Makefile @@ -20,7 +20,7 @@ all_targets += poll poll-cancel ring-leak fsync io_uring_setup io_uring_register connect 7ad0e4b2f83c-test submit-reuse fallocate open-close \ file-update statx accept-reuse poll-v-poll fadvise madvise \ short-read openat2 probe shared-wq personality eventfd \ - send_recv eventfd-ring across-fork + send_recv eventfd-ring across-fork sq-poll-kthread include ../Makefile.quiet @@ -47,7 +47,7 @@ test_srcs := poll.c poll-cancel.c ring-leak.c fsync.c io_uring_setup.c \ 7ad0e4b2f83c-test.c submit-reuse.c fallocate.c open-close.c \ file-update.c statx.c accept-reuse.c poll-v-poll.c fadvise.c \ madvise.c short-read.c openat2.c probe.c shared-wq.c \ - personality.c eventfd.c eventfd-ring.c across-fork.c + personality.c eventfd.c eventfd-ring.c across-fork.c sq-poll-kthread.c test_objs := $(patsubst %.c,%.ol,$(test_srcs)) diff --git a/test/sq-poll-kthread.c b/test/sq-poll-kthread.c new file mode 100644 index 0000000..d53605c --- /dev/null +++ b/test/sq-poll-kthread.c @@ -0,0 +1,165 @@ +/* + * Description: test if io_uring SQ poll kthread is stopped when the userspace + * process ended with or without closing the io_uring fd + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "liburing.h" + +#define SQ_THREAD_IDLE 2000 +#define BUF_SIZE 128 +#define KTHREAD_NAME "io_uring-sq" + +enum { + TEST_OK = 0, + TEST_SKIPPED = 1, + TEST_FAILED = 2, +}; + +static int do_test_sq_poll_kthread_stopped(bool do_exit) +{ + int ret = 0, pipe1[2]; + struct io_uring_params param; + struct io_uring ring; + struct io_uring_sqe *sqe; + struct io_uring_cqe *cqe; + uint8_t buf[BUF_SIZE]; + struct iovec iov; + + if (geteuid()) { + fprintf(stderr, "sqpoll requires root!\n"); + return TEST_SKIPPED; + } + + if (pipe(pipe1) != 0) { + perror("pipe"); + return TEST_FAILED; + } + + memset(¶m, 0, sizeof(param)); + + param.flags |= IORING_SETUP_SQPOLL; + param.sq_thread_idle = SQ_THREAD_IDLE; + + ret = io_uring_queue_init_params(16, &ring, ¶m); + if (ret) { + fprintf(stderr, "ring setup failed\n"); + ret = TEST_FAILED; + goto err_pipe; + } + + ret = io_uring_register_files(&ring, &pipe1[1], 1); + if (ret) { + fprintf(stderr, "file reg failed: %d\n", ret); + ret = TEST_FAILED; + goto err_uring; + } + + iov.iov_base = buf; + iov.iov_len = BUF_SIZE; + + sqe = io_uring_get_sqe(&ring); + if (!sqe) { + fprintf(stderr, "io_uring_get_sqe failed\n"); + ret = TEST_FAILED; + goto err_uring; + } + + io_uring_prep_writev(sqe, 0, &iov, 1, 0); + sqe->flags |= IOSQE_FIXED_FILE; + + ret = io_uring_submit(&ring); + if (ret < 0) { + fprintf(stderr, "io_uring_submit failed - ret: %d\n", + ret); + ret = TEST_FAILED; + goto err_uring; + } + + ret = io_uring_wait_cqe(&ring, &cqe); + if (ret < 0) { + fprintf(stderr, "io_uring_wait_cqe - ret: %d\n", + ret); + ret = TEST_FAILED; + goto err_uring; + } + + if (cqe->res != BUF_SIZE) { + fprintf(stderr, "unexpected cqe->res %d [expected %d]\n", + cqe->res, BUF_SIZE); + ret = TEST_FAILED; + goto err_uring; + + } + + io_uring_cqe_seen(&ring, cqe); + + ret = TEST_OK; + +err_uring: + if (do_exit) + io_uring_queue_exit(&ring); +err_pipe: + close(pipe1[0]); + close(pipe1[1]); + + return ret; +} + +int test_sq_poll_kthread_stopped(bool do_exit) { + pid_t pid; + int status = 0; + + pid = fork(); + + if (pid == 0) { + int ret = do_test_sq_poll_kthread_stopped(do_exit); + exit(ret); + } + + pid = wait(&status); + if (status != 0) + return WEXITSTATUS(status); + + if (system("ps --ppid 2 | grep " KTHREAD_NAME) == 0) { + fprintf(stderr, "%s kthread still running!\n", KTHREAD_NAME); + return TEST_FAILED; + } + + return 0; +} + +int main(int argc, char *argv[]) +{ + int ret; + + ret = test_sq_poll_kthread_stopped(true); + if (ret == TEST_SKIPPED) { + printf("test_sq_poll_kthread_stopped_exit: skipped\n"); + } else if (ret == TEST_FAILED) { + fprintf(stderr, "test_sq_poll_kthread_stopped_exit failed\n"); + return ret; + } + + ret = test_sq_poll_kthread_stopped(false); + if (ret == TEST_SKIPPED) { + printf("test_sq_poll_kthread_stopped_noexit: skipped\n"); + } else if (ret == TEST_FAILED) { + fprintf(stderr, "test_sq_poll_kthread_stopped_noexit failed\n"); + return ret; + } + + return 0; +} -- 2.24.1