* futex testsuite suggestion... @ 2014-10-27 19:56 David Miller 2014-10-27 20:29 ` Darren Hart 0 siblings, 1 reply; 5+ messages in thread From: David Miller @ 2014-10-27 19:56 UTC (permalink / raw) To: dvhart; +Cc: linux-kernel First of all, thanks so much for writing your futex test suite, it's proved invaluable for sparc64 kernel development for me lately. I'd like to suggest that you add a test that triggers transparent hugepages, because if an architecture doesn't implement __get_user_pages_fast() such futexes cause a machine to hang. I hacked up something simple that took the existing performance test and made it operate in a register allocated using memalign(). I would suggest doing a memalign(HUGEPAGE_SIZE, HUGEPAGE_SIZE) then iterating running a futex test within each normal page within that hugepage. Thanks! ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: futex testsuite suggestion... 2014-10-27 19:56 futex testsuite suggestion David Miller @ 2014-10-27 20:29 ` Darren Hart 2014-10-27 20:31 ` David Miller 0 siblings, 1 reply; 5+ messages in thread From: Darren Hart @ 2014-10-27 20:29 UTC (permalink / raw) To: David Miller; +Cc: linux-kernel, Darren Hart On 10/27/14 12:56, David Miller wrote: > > First of all, thanks so much for writing your futex test suite, it's > proved invaluable for sparc64 kernel development for me lately. Hi David, Glad to hear it :-) > > I'd like to suggest that you add a test that triggers transparent > hugepages, because if an architecture doesn't implement > __get_user_pages_fast() such futexes cause a machine to hang. > > I hacked up something simple that took the existing performance > test and made it operate in a register allocated using memalign(). > > I would suggest doing a memalign(HUGEPAGE_SIZE, HUGEPAGE_SIZE) then > iterating running a futex test within each normal page within that > hugepage. Do you want this option for the performance tests, or would a less intensive functional test be sufficient? The other thing to note is there have been several efforts/false starts to get futextests into perf and kselftest. We currently considering splitting futextests across the two (performance to perf, functional to kselftest). The TODO for a fuzz tester is handled *more* than adequately by trinity. I'm perfectly happy to add such a test. I'm currently buried under a number of other things that have resulted in futextests suffering somewhat. So a couple of things to help make this happen: 1) Could you send me your hacked up test, in whatever condition? 2) I'm more than happy to accept patches, but I do understand why you might prefer to have someone else write it :-) Thanks, -- Darren Hart Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: futex testsuite suggestion... 2014-10-27 20:29 ` Darren Hart @ 2014-10-27 20:31 ` David Miller 2014-11-22 8:02 ` Darren Hart 0 siblings, 1 reply; 5+ messages in thread From: David Miller @ 2014-10-27 20:31 UTC (permalink / raw) To: dvhart; +Cc: linux-kernel, dvhart From: Darren Hart <dvhart@linux.intel.com> Date: Mon, 27 Oct 2014 13:29:14 -0700 > On 10/27/14 12:56, David Miller wrote: >> I'd like to suggest that you add a test that triggers transparent >> hugepages, because if an architecture doesn't implement >> __get_user_pages_fast() such futexes cause a machine to hang. >> >> I hacked up something simple that took the existing performance >> test and made it operate in a register allocated using memalign(). >> >> I would suggest doing a memalign(HUGEPAGE_SIZE, HUGEPAGE_SIZE) then >> iterating running a futex test within each normal page within that >> hugepage. > > Do you want this option for the performance tests, or would a less > intensive functional test be sufficient? I think a functional test is sufficient. > I'm perfectly happy to add such a test. I'm currently buried under a > number of other things that have resulted in futextests suffering > somewhat. So a couple of things to help make this happen: > > 1) Could you send me your hacked up test, in whatever condition? See at the end of this email. > 2) I'm more than happy to accept patches, but I do understand why you > might prefer to have someone else write it :-) I could find time to work on this. :) diff --git a/performance/harness.h b/performance/harness.h index a395492..5cfd09b 100644 --- a/performance/harness.h +++ b/performance/harness.h @@ -38,6 +38,7 @@ #include <limits.h> #include <pthread.h> #include <stdio.h> +#include <malloc.h> #include <sys/times.h> #include "logging.h" @@ -102,35 +103,39 @@ static void * locktest_thread(void * dummy) static int locktest(void locktest_function(futex_t * ptr, int loops), int iterations, int threads) { - struct locktest_shared shared; + struct locktest_shared *shared; pthread_t thread[threads]; + void *buf; int i; clock_t before, after; struct tms tms_before, tms_after; int wall, user, system; double tick; - barrier_init(&shared.barrier_before, threads); - barrier_init(&shared.barrier_after, threads); - shared.locktest_function = locktest_function; - shared.loops = iterations / threads; - shared.futex = 0; + buf = memalign(8 * 1024 * 1024, 8 * 1024 * 1024); + shared = (buf + (8 * 1024 * 1024) - sizeof(*shared)); + + barrier_init(&shared->barrier_before, threads); + barrier_init(&shared->barrier_after, threads); + shared->locktest_function = locktest_function; + shared->loops = iterations / threads; + shared->futex = 0; for (i = 0; i < threads; i++) if (pthread_create(thread + i, NULL, locktest_thread, - &shared)) { + shared)) { error("pthread_create\n", errno); /* Could not create thread; abort */ - barrier_unblock(&shared.barrier_before, -1); + barrier_unblock(&shared->barrier_before, -1); while (--i >= 0) pthread_join(thread[i], NULL); print_result(RET_ERROR); return RET_ERROR; } - barrier_wait(&shared.barrier_before); + barrier_wait(&shared->barrier_before); before = times(&tms_before); - barrier_unblock(&shared.barrier_before, 1); - barrier_wait(&shared.barrier_after); + barrier_unblock(&shared->barrier_before, 1); + barrier_wait(&shared->barrier_after); after = times(&tms_after); wall = after - before; user = tms_after.tms_utime - tms_before.tms_utime; @@ -139,12 +144,12 @@ static int locktest(void locktest_function(futex_t * ptr, int loops), info("%.2fs user, %.2fs system, %.2fs wall, %.2f cores\n", user * tick, system * tick, wall * tick, wall ? (user + system) * 1. / wall : 1.); - barrier_unblock(&shared.barrier_after, 1); + barrier_unblock(&shared->barrier_after, 1); for (i = 0; i < threads; i++) pthread_join(thread[i], NULL); printf("Result: %.0f Kiter/s\n", - (threads * shared.loops) / (wall * tick * 1000)); + (threads * shared->loops) / (wall * tick * 1000)); return RET_PASS; } ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: futex testsuite suggestion... 2014-10-27 20:31 ` David Miller @ 2014-11-22 8:02 ` Darren Hart 2014-11-24 22:07 ` David Miller 0 siblings, 1 reply; 5+ messages in thread From: Darren Hart @ 2014-11-22 8:02 UTC (permalink / raw) To: David Miller; +Cc: dvhart, linux-kernel On Mon, Oct 27, 2014 at 04:31:16PM -0400, David Miller wrote: > From: Darren Hart <dvhart@linux.intel.com> > Date: Mon, 27 Oct 2014 13:29:14 -0700 > > > On 10/27/14 12:56, David Miller wrote: > >> I'd like to suggest that you add a test that triggers transparent > >> hugepages, because if an architecture doesn't implement > >> __get_user_pages_fast() such futexes cause a machine to hang. > >> > >> I hacked up something simple that took the existing performance > >> test and made it operate in a register allocated using memalign(). > >> > >> I would suggest doing a memalign(HUGEPAGE_SIZE, HUGEPAGE_SIZE) then > >> iterating running a futex test within each normal page within that > >> hugepage. > > > > Do you want this option for the performance tests, or would a less > > intensive functional test be sufficient? > > I think a functional test is sufficient. Hi David, >From your suggestion I put together a simple transparent hugepage functional test. See the "thp" branch, functional/futex_wait_thp.c. I'd like your thoughts on if this functions as desired. Is the simple single threaded timeout sufficient, or would you prefer to see a waiter/waker pair of threads for each iteration? Some TODOs still: I wasn't sure if there was a way to test for hugepagesize and my quick search didn't reveal anything (other than /proc/meminfo). Check at runtime if the test is getting a huge page, otherwise it just reports success, but used several regular pages instead. -- Darren Hart Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: futex testsuite suggestion... 2014-11-22 8:02 ` Darren Hart @ 2014-11-24 22:07 ` David Miller 0 siblings, 0 replies; 5+ messages in thread From: David Miller @ 2014-11-24 22:07 UTC (permalink / raw) To: dvhart; +Cc: dvhart, linux-kernel From: Darren Hart <dvhart@infradead.org> Date: Sat, 22 Nov 2014 00:02:39 -0800 > From your suggestion I put together a simple transparent hugepage functional > test. See the "thp" branch, functional/futex_wait_thp.c. > > I'd like your thoughts on if this functions as desired. Is the simple single > threaded timeout sufficient, or would you prefer to see a waiter/waker pair of > threads for each iteration? > > Some TODOs still: > > I wasn't sure if there was a way to test for hugepagesize and my quick search > didn't reveal anything (other than /proc/meminfo). > > Check at runtime if the test is getting a huge page, otherwise it just reports > success, but used several regular pages instead. This looks excellent! I did a test run on my sparc64 box and it passed as well. I do not thinks thread waiter/waker pairs are necessary for this test. And indeed I do not know of any way other than /proc/meminfo to test for this. Perhaps there are some tricks in the LTP testsuite? Thanks! ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2014-11-24 22:07 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-10-27 19:56 futex testsuite suggestion David Miller 2014-10-27 20:29 ` Darren Hart 2014-10-27 20:31 ` David Miller 2014-11-22 8:02 ` Darren Hart 2014-11-24 22:07 ` David Miller
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox