From nobody Wed May 25 00:18:19 2022 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 3D5891B3BBC8; Wed, 25 May 2022 00:18:20 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4L7BVg5rK9z3mhr; Wed, 25 May 2022 00:18:19 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1653437899; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=dazhTJ4MIHj0jhK0E+u8LPhlzLHZLG2HF/47jOk6rao=; b=jm0E1u8s03qYgI4RTyMxuGdMcofzrVh9yynlnoXMoHK2rbN0XyzzQdKlWcWy5fmau2Q/0L WiIM9/UfgR7GRichWwy65IMje5r5CUe11sg7rFeDvl4KsdUCXuaRp4b+3SefaOobNYswT0 PHCLvMqWfun6eNXW/LDA1gVx25G7f3+MVgwidco1S7REVfvQSz3aD4O9QjsjKtwPKjtV5O zkCQNTAQXmBGpAyQsfrGQKInwEhFciA0dT2/nR4Jog/L1btHBpn/C+7w8uAp3ZdmTgdblu vjM09x9BWHt/HSZ0BKcJp+c+wEzyhmE33BYNYznuyQXJipFNV7dr8xG5hzpYjQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 9FFDD6964; Wed, 25 May 2022 00:18:19 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 24P0IJaN006093; Wed, 25 May 2022 00:18:19 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 24P0IJ9p006092; Wed, 25 May 2022 00:18:19 GMT (envelope-from git) Date: Wed, 25 May 2022 00:18:19 GMT Message-Id: <202205250018.24P0IJ9p006092@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mark Johnston Subject: git: d6d4f9b45e0b - main - kqueue tests: Add new EVFILT_TIMER regression tests from upstream List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: d6d4f9b45e0be306bdaf53b2133b2cd0f7642167 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1653437899; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=dazhTJ4MIHj0jhK0E+u8LPhlzLHZLG2HF/47jOk6rao=; b=M9g2AibaSIjYGBzKzpmATsF/OG9DkzwPkax2tjwFVM0gI3w/+gTWFD2v6z6gI3V1UXFmv3 rUHywxO8x9nbtjPd+Tdy1QmJTEWdHfIoboCHZ68Bc1ifNiG4L2Nr/VmgQytFUD8dsLLulq DZRn/vtRtI/Y7uCTRCSPY5zyaNLQhGNEXffIHMwBtNt9Q88WYO5Rk9/0JJlCeePQB4c70u KKUu/Th2A5IiCaVy1buz+ctOoUWlXjjx0ckk2xxuwCu3aBsPsmpJbUeJqnOjBeKr1uw2br rPD4eNsnbPRl7WE4jvttcn1FqTh0BGeHOdB0XYWAdgJnJ7PIsJhqCKjE+/cTOw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1653437899; a=rsa-sha256; cv=none; b=TxgwaOtE0l0lNbsLDc6ieZrYTBoCQpByPIfbzpqj+96a5nNNnMJHQemT2Guw7rjG1jOII/ r9u7qo44r9rN7aSEUudYk8L2zuWxkkaUnXNGT3c9apJ9mcaDoRyacFrVQutIXOprhk6ETb 7o+wTgza5cGxhFXbC+LTcSvG3PRr/e9Xjfcj84d6vbgKbe6WdvAqWEYnwzLvJaw8GIvEDB PjIINZ5STfYi/XO40gNxVx6xR3BNe6+otMTWlzgJUs4BBvznpBDeTxpfam2G2WYcNHa5+C qs9PJdKVM7xkZ6Yjy1ff0d2mi1bdNytyJjmbJFFUbuR5sF8fOXatVl8cOqmXaw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=d6d4f9b45e0be306bdaf53b2133b2cd0f7642167 commit d6d4f9b45e0be306bdaf53b2133b2cd0f7642167 Author: Mark Johnston AuthorDate: 2022-05-25 00:16:32 +0000 Commit: Mark Johnston CommitDate: 2022-05-25 00:16:32 +0000 kqueue tests: Add new EVFILT_TIMER regression tests from upstream One of the tests exposes the regression reported in PR 264131. One test is disabled because FreeBSD does not support setting EV_ONESHOT on an already-added periodic timer. Though, in this case the flag is simply ignored, which isn't ideal. One test is slightly modified to set EV_ADD when reconfiguring a disabled timer per some commentary in PR 258412. Ideally we would re-import the test suite from libkqueue but there is a fair bit of divergence so this will require some effort. This just gets us one small step closer while increasing test coverage. PR: 258412 MFC after: 2 weeks Sponsored by: The FreeBSD Foundation --- tests/sys/kqueue/libkqueue/config.h | 1 + tests/sys/kqueue/libkqueue/timer.c | 129 +++++++++++++++++++++++++++++++++++- 2 files changed, 128 insertions(+), 2 deletions(-) diff --git a/tests/sys/kqueue/libkqueue/config.h b/tests/sys/kqueue/libkqueue/config.h index a204092a2ab2..41a67837efe8 100644 --- a/tests/sys/kqueue/libkqueue/config.h +++ b/tests/sys/kqueue/libkqueue/config.h @@ -7,6 +7,7 @@ #undef HAVE_NOTE_TRUNCATE #define HAVE_EVFILT_TIMER 1 #define HAVE_EVFILT_USER 1 +#define WITH_NATIVE_KQUEUE_BUGS 0 #define PROGRAM "libkqueue-test" #define VERSION "0.1" #define TARGET "freebsd" diff --git a/tests/sys/kqueue/libkqueue/timer.c b/tests/sys/kqueue/libkqueue/timer.c index 330c22c62bc5..aa9d41ce6bf8 100644 --- a/tests/sys/kqueue/libkqueue/timer.c +++ b/tests/sys/kqueue/libkqueue/timer.c @@ -182,7 +182,84 @@ test_periodic(void) } static void -disable_and_enable(void) +test_periodic_modify(void) +{ + const char *test_id = "kevent(EVFILT_TIMER, periodic_modify)"; + struct kevent kev; + + test_begin(test_id); + + test_no_kevents(); + + EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD, 0, 1000, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Retrieve the event */ + kev.flags = EV_ADD | EV_CLEAR; + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Check if the event occurs again */ + EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD, 0, 500, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + kev.flags = EV_ADD | EV_CLEAR; + sleep(1); + kev.data = 2; /* Should have fired twice */ + + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Delete the event */ + kev.flags = EV_DELETE; + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + success(); +} + +#if WITH_NATIVE_KQUEUE_BUGS +static void +test_periodic_to_oneshot(void) +{ + const char *test_id = "kevent(EVFILT_TIMER, period_to_oneshot)"; + struct kevent kev; + + test_begin(test_id); + + test_no_kevents(); + + EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD, 0, 1000, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Retrieve the event */ + kev.flags = EV_ADD | EV_CLEAR; + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Check if the event occurs again */ + sleep(1); + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Switch to oneshot */ + EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ONESHOT, 0, 500, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + kev.flags = EV_ADD | EV_CLEAR | EV_ONESHOT; + + sleep(1); + kev.data = 1; /* Should have fired once */ + + kevent_cmp(&kev, kevent_get(kqfd)); + + success(); +} +#endif + +static void +test_disable_and_enable(void) { const char *test_id = "kevent(EVFILT_TIMER, EV_DISABLE and EV_ENABLE)"; struct kevent kev; @@ -618,6 +695,49 @@ test_update_timing(void) success(); } +static void +test_dispatch(void) +{ + const char *test_id = "kevent(EVFILT_TIMER, EV_ADD | EV_DISPATCH)"; + struct kevent kev; + + test_no_kevents(); + + EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_DISPATCH, 0, 200, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + + /* Get one event */ + kev.flags = EV_ADD | EV_CLEAR | EV_DISPATCH; + kev.data = 1; + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Confirm that the knote is disabled due to EV_DISPATCH */ + usleep(500000); + test_no_kevents(); + + /* Enable the knote and make sure no events are pending */ + EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_ADD | EV_ENABLE | EV_DISPATCH, 0, 200, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + test_no_kevents(); + + /* Get the next event */ + usleep(1100000); /* 1100 ms */ + kev.flags = EV_ADD | EV_CLEAR | EV_DISPATCH; + kev.data = 5; + kevent_cmp(&kev, kevent_get(kqfd)); + + /* Remove the knote and ensure the event no longer fires */ + EV_SET(&kev, vnode_fd, EVFILT_TIMER, EV_DELETE, 0, 0, NULL); + if (kevent(kqfd, &kev, 1, NULL, 0, NULL) < 0) + err(1, "%s", test_id); + usleep(500000); /* 500ms */ + test_no_kevents(); + + success(); +} + void test_evfilt_timer(void) { @@ -627,6 +747,10 @@ test_evfilt_timer(void) test_kevent_timer_get(); test_oneshot(); test_periodic(); + test_periodic_modify(); +#if WITH_NATIVE_KQUEUE_BUGS + test_periodic_to_oneshot(); +#endif test_abstime(); test_abstime_epoch(); test_abstime_preboot(); @@ -636,6 +760,7 @@ test_evfilt_timer(void) test_update_expired(); test_update_timing(); test_update_periodic(); - disable_and_enable(); + test_disable_and_enable(); + test_dispatch(); close(kqfd); }