From owner-svn-src-projects@freebsd.org Thu May 9 17:57:05 2019 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id C424C15893CD for ; Thu, 9 May 2019 17:57:05 +0000 (UTC) (envelope-from asomers@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) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 6A4B272372; Thu, 9 May 2019 17:57:05 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4138F20722; Thu, 9 May 2019 17:57:05 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x49Hv5bo061608; Thu, 9 May 2019 17:57:05 GMT (envelope-from asomers@FreeBSD.org) Received: (from asomers@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x49Hv5cr061607; Thu, 9 May 2019 17:57:05 GMT (envelope-from asomers@FreeBSD.org) Message-Id: <201905091757.x49Hv5cr061607@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: asomers set sender to asomers@FreeBSD.org using -f From: Alan Somers Date: Thu, 9 May 2019 17:57:05 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r347401 - projects/fuse2/tests/sys/fs/fusefs X-SVN-Group: projects X-SVN-Commit-Author: asomers X-SVN-Commit-Paths: projects/fuse2/tests/sys/fs/fusefs X-SVN-Commit-Revision: 347401 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 6A4B272372 X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-2.97 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_HAM_MEDIUM(-1.00)[-0.999,0]; NEURAL_HAM_LONG(-1.00)[-1.000,0]; NEURAL_HAM_SHORT(-0.97)[-0.969,0]; ASN(0.00)[asn:11403, ipnet:2610:1c1:1::/48, country:US] X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 09 May 2019 17:57:06 -0000 Author: asomers Date: Thu May 9 17:57:04 2019 New Revision: 347401 URL: https://svnweb.freebsd.org/changeset/base/347401 Log: fusefs: eliminate some sleeps in the Interrupt tests Replace some sleeps with semaphore operations. Not all sleeps can be replaced, though. Some are trying to lose a race. Sponsored by: The FreeBSD Foundation Modified: projects/fuse2/tests/sys/fs/fusefs/interrupt.cc Modified: projects/fuse2/tests/sys/fs/fusefs/interrupt.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fusefs/interrupt.cc Thu May 9 17:44:16 2019 (r347400) +++ projects/fuse2/tests/sys/fs/fusefs/interrupt.cc Thu May 9 17:57:04 2019 (r347401) @@ -31,6 +31,7 @@ extern "C" { #include #include +#include #include #include #include @@ -52,8 +53,11 @@ const char RELDIRPATH0[] = "some_dir"; const char FULLDIRPATH1[] = "mountpoint/other_dir"; const char RELDIRPATH1[] = "other_dir"; +static sem_t *blocked_semaphore; static sem_t *signaled_semaphore; +static bool killer_should_sleep = false; + /* Don't do anything; all we care about is that the syscall gets interrupted */ void sigusr2_handler(int __unused sig) { if (verbosity > 1) { @@ -63,11 +67,11 @@ void sigusr2_handler(int __unused sig) { } void* killer(void* target) { - /* - * Sleep for awhile so we can be mostly confident that the main thread - * is already blocked in write(2) - */ - usleep(250'000); + /* Wait until the main thread is blocked in fdisp_wait_answ */ + if (killer_should_sleep) + usleep(250'000); + else + sem_wait(blocked_semaphore); if (verbosity > 1) printf("Signalling! thread %p\n", target); pthread_kill((pthread_t)target, SIGUSR2); @@ -97,11 +101,11 @@ void expect_mkdir(uint64_t *mkdir_unique) EXPECT_CALL(*m_mock, process( ResultOf([=](auto in) { return (in->header.opcode == FUSE_MKDIR); - }, Eq(true)), _) ).WillOnce(Invoke([=](auto in, auto &out __unused) { *mkdir_unique = in->header.unique; + sem_post(blocked_semaphore); })); } @@ -119,6 +123,7 @@ void expect_read(uint64_t ino, uint64_t *read_unique) _) ).WillOnce(Invoke([=](auto in, auto &out __unused) { *read_unique = in->header.unique; + sem_post(blocked_semaphore); })); } @@ -136,18 +141,29 @@ void expect_write(uint64_t ino, uint64_t *write_unique _) ).WillOnce(Invoke([=](auto in, auto &out __unused) { *write_unique = in->header.unique; + sem_post(blocked_semaphore); })); } -void setup_interruptor(pthread_t target) +void setup_interruptor(pthread_t target, bool sleep = false) { ASSERT_NE(SIG_ERR, signal(SIGUSR2, sigusr2_handler)) << strerror(errno); + killer_should_sleep = sleep; ASSERT_EQ(0, pthread_create(&m_child, NULL, killer, (void*)target)) << strerror(errno); } void SetUp() { + const int mprot = PROT_READ | PROT_WRITE; + const int mflags = MAP_ANON | MAP_SHARED; + signaled_semaphore = NULL; + + blocked_semaphore = (sem_t*)mmap(NULL, sizeof(*blocked_semaphore), + mprot, mflags, -1, 0); + ASSERT_NE(MAP_FAILED, blocked_semaphore) << strerror(errno); + ASSERT_EQ(0, sem_init(blocked_semaphore, 1, 0)) << strerror(errno); + FuseTest::SetUp(); } @@ -161,6 +177,9 @@ void TearDown() { sa.sa_handler = SIG_DFL; sigaction(SIGUSR2, &sa, NULL); + sem_destroy(blocked_semaphore); + munmap(blocked_semaphore, sizeof(*blocked_semaphore)); + FuseTest::TearDown(); } }; @@ -451,7 +470,7 @@ TEST_F(Interrupt, in_kernel_restartable) ASSERT_EQ(0, pthread_create(&th1, NULL, read1, (void*)(intptr_t)fd1)) << strerror(errno); - setup_interruptor(self); + setup_interruptor(self, true); pause(); /* Wait for signal */ @@ -518,9 +537,10 @@ TEST_F(Interrupt, in_kernel_nonrestartable) ASSERT_EQ(0, pthread_create(&th0, NULL, mkdir0, NULL)) << strerror(errno); - setup_interruptor(self); - sem_wait(&sem1); /* Sequence the two operations */ + + setup_interruptor(self, true); + r = extattr_set_fd(fd1, ns, "foo", (void*)value, value_len); EXPECT_EQ(EINTR, errno); @@ -676,7 +696,7 @@ TEST_F(Interrupt, priority) signaled_semaphore = &sem0; sem_wait(&sem1); /* Sequence the two mkdirs */ - setup_interruptor(th0); + setup_interruptor(th0, true); ASSERT_EQ(0, mkdir(FULLDIRPATH1, MODE)) << strerror(errno); /* Wait awhile to make sure the signal generates no FUSE_INTERRUPT */