Commit b27ce776 authored by Nicholas Piggin's avatar Nicholas Piggin Committed by Michael Ellerman

selftests/powerpc: context_switch use private futexes with threads

This reduces overhead of mutex locking and increases context switch
rate significantly (which helps to measure and profile the context
switch path).
Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent b802ab46
...@@ -258,9 +258,14 @@ static unsigned long xchg(unsigned long *p, unsigned long val) ...@@ -258,9 +258,14 @@ static unsigned long xchg(unsigned long *p, unsigned long val)
return __atomic_exchange_n(p, val, __ATOMIC_SEQ_CST); return __atomic_exchange_n(p, val, __ATOMIC_SEQ_CST);
} }
static int processes;
static int mutex_lock(unsigned long *m) static int mutex_lock(unsigned long *m)
{ {
int c; int c;
int flags = FUTEX_WAIT;
if (!processes)
flags |= FUTEX_PRIVATE_FLAG;
c = cmpxchg(m, 0, 1); c = cmpxchg(m, 0, 1);
if (!c) if (!c)
...@@ -270,7 +275,7 @@ static int mutex_lock(unsigned long *m) ...@@ -270,7 +275,7 @@ static int mutex_lock(unsigned long *m)
c = xchg(m, 2); c = xchg(m, 2);
while (c) { while (c) {
sys_futex(m, FUTEX_WAIT, 2, NULL, NULL, 0); sys_futex(m, flags, 2, NULL, NULL, 0);
c = xchg(m, 2); c = xchg(m, 2);
} }
...@@ -279,12 +284,16 @@ static int mutex_lock(unsigned long *m) ...@@ -279,12 +284,16 @@ static int mutex_lock(unsigned long *m)
static int mutex_unlock(unsigned long *m) static int mutex_unlock(unsigned long *m)
{ {
int flags = FUTEX_WAKE;
if (!processes)
flags |= FUTEX_PRIVATE_FLAG;
if (*m == 2) if (*m == 2)
*m = 0; *m = 0;
else if (xchg(m, 0) == 1) else if (xchg(m, 0) == 1)
return 0; return 0;
sys_futex(m, FUTEX_WAKE, 1, NULL, NULL, 0); sys_futex(m, flags, 1, NULL, NULL, 0);
return 0; return 0;
} }
...@@ -293,6 +302,11 @@ static unsigned long *m1, *m2; ...@@ -293,6 +302,11 @@ static unsigned long *m1, *m2;
static void futex_setup(int cpu1, int cpu2) static void futex_setup(int cpu1, int cpu2)
{ {
if (!processes) {
static unsigned long _m1, _m2;
m1 = &_m1;
m2 = &_m2;
} else {
int shmid; int shmid;
void *shmaddr; void *shmaddr;
...@@ -313,6 +327,7 @@ static void futex_setup(int cpu1, int cpu2) ...@@ -313,6 +327,7 @@ static void futex_setup(int cpu1, int cpu2)
m1 = shmaddr; m1 = shmaddr;
m2 = shmaddr + sizeof(*m1); m2 = shmaddr + sizeof(*m1);
}
*m1 = 0; *m1 = 0;
*m2 = 0; *m2 = 0;
...@@ -352,8 +367,6 @@ static struct actions futex_actions = { ...@@ -352,8 +367,6 @@ static struct actions futex_actions = {
.thread2 = futex_thread2, .thread2 = futex_thread2,
}; };
static int processes;
static struct option options[] = { static struct option options[] = {
{ "test", required_argument, 0, 't' }, { "test", required_argument, 0, 't' },
{ "process", no_argument, &processes, 1 }, { "process", no_argument, &processes, 1 },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment