Commit c02dd004 authored by Davidlohr Bueso's avatar Davidlohr Bueso Committed by Greg Kroah-Hartman

locking/locktorture: Fix num reader/writer corner cases


[ Upstream commit 2ce77d16 ]

Things can explode for locktorture if the user does combinations
of nwriters_stress=0 nreaders_stress=0. Fix this by not assuming
we always want to torture writer threads.
Reported-by: default avatarJeremy Linton <jeremy.linton@arm.com>
Signed-off-by: default avatarDavidlohr Bueso <dbueso@suse.de>
Signed-off-by: default avatarPaul E. McKenney <paulmck@linux.vnet.ibm.com>
Reviewed-by: default avatarJeremy Linton <jeremy.linton@arm.com>
Tested-by: default avatarJeremy Linton <jeremy.linton@arm.com>
Signed-off-by: default avatarSasha Levin <alexander.levin@microsoft.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 09e59383
...@@ -715,8 +715,7 @@ static void __torture_print_stats(char *page, ...@@ -715,8 +715,7 @@ static void __torture_print_stats(char *page,
{ {
bool fail = 0; bool fail = 0;
int i, n_stress; int i, n_stress;
long max = 0; long max = 0, min = statp ? statp[0].n_lock_acquired : 0;
long min = statp[0].n_lock_acquired;
long long sum = 0; long long sum = 0;
n_stress = write ? cxt.nrealwriters_stress : cxt.nrealreaders_stress; n_stress = write ? cxt.nrealwriters_stress : cxt.nrealreaders_stress;
...@@ -823,7 +822,7 @@ static void lock_torture_cleanup(void) ...@@ -823,7 +822,7 @@ static void lock_torture_cleanup(void)
* such, only perform the underlying torture-specific cleanups, * such, only perform the underlying torture-specific cleanups,
* and avoid anything related to locktorture. * and avoid anything related to locktorture.
*/ */
if (!cxt.lwsa) if (!cxt.lwsa && !cxt.lrsa)
goto end; goto end;
if (writer_tasks) { if (writer_tasks) {
...@@ -898,6 +897,13 @@ static int __init lock_torture_init(void) ...@@ -898,6 +897,13 @@ static int __init lock_torture_init(void)
firsterr = -EINVAL; firsterr = -EINVAL;
goto unwind; goto unwind;
} }
if (nwriters_stress == 0 && nreaders_stress == 0) {
pr_alert("lock-torture: must run at least one locking thread\n");
firsterr = -EINVAL;
goto unwind;
}
if (cxt.cur_ops->init) if (cxt.cur_ops->init)
cxt.cur_ops->init(); cxt.cur_ops->init();
...@@ -921,17 +927,19 @@ static int __init lock_torture_init(void) ...@@ -921,17 +927,19 @@ static int __init lock_torture_init(void)
#endif #endif
/* Initialize the statistics so that each run gets its own numbers. */ /* Initialize the statistics so that each run gets its own numbers. */
if (nwriters_stress) {
lock_is_write_held = 0;
cxt.lwsa = kmalloc(sizeof(*cxt.lwsa) * cxt.nrealwriters_stress, GFP_KERNEL);
if (cxt.lwsa == NULL) {
VERBOSE_TOROUT_STRING("cxt.lwsa: Out of memory");
firsterr = -ENOMEM;
goto unwind;
}
lock_is_write_held = 0; for (i = 0; i < cxt.nrealwriters_stress; i++) {
cxt.lwsa = kmalloc(sizeof(*cxt.lwsa) * cxt.nrealwriters_stress, GFP_KERNEL); cxt.lwsa[i].n_lock_fail = 0;
if (cxt.lwsa == NULL) { cxt.lwsa[i].n_lock_acquired = 0;
VERBOSE_TOROUT_STRING("cxt.lwsa: Out of memory"); }
firsterr = -ENOMEM;
goto unwind;
}
for (i = 0; i < cxt.nrealwriters_stress; i++) {
cxt.lwsa[i].n_lock_fail = 0;
cxt.lwsa[i].n_lock_acquired = 0;
} }
if (cxt.cur_ops->readlock) { if (cxt.cur_ops->readlock) {
...@@ -948,19 +956,21 @@ static int __init lock_torture_init(void) ...@@ -948,19 +956,21 @@ static int __init lock_torture_init(void)
cxt.nrealreaders_stress = cxt.nrealwriters_stress; cxt.nrealreaders_stress = cxt.nrealwriters_stress;
} }
lock_is_read_held = 0; if (nreaders_stress) {
cxt.lrsa = kmalloc(sizeof(*cxt.lrsa) * cxt.nrealreaders_stress, GFP_KERNEL); lock_is_read_held = 0;
if (cxt.lrsa == NULL) { cxt.lrsa = kmalloc(sizeof(*cxt.lrsa) * cxt.nrealreaders_stress, GFP_KERNEL);
VERBOSE_TOROUT_STRING("cxt.lrsa: Out of memory"); if (cxt.lrsa == NULL) {
firsterr = -ENOMEM; VERBOSE_TOROUT_STRING("cxt.lrsa: Out of memory");
kfree(cxt.lwsa); firsterr = -ENOMEM;
cxt.lwsa = NULL; kfree(cxt.lwsa);
goto unwind; cxt.lwsa = NULL;
} goto unwind;
}
for (i = 0; i < cxt.nrealreaders_stress; i++) {
cxt.lrsa[i].n_lock_fail = 0; for (i = 0; i < cxt.nrealreaders_stress; i++) {
cxt.lrsa[i].n_lock_acquired = 0; cxt.lrsa[i].n_lock_fail = 0;
cxt.lrsa[i].n_lock_acquired = 0;
}
} }
} }
...@@ -990,12 +1000,14 @@ static int __init lock_torture_init(void) ...@@ -990,12 +1000,14 @@ static int __init lock_torture_init(void)
goto unwind; goto unwind;
} }
writer_tasks = kzalloc(cxt.nrealwriters_stress * sizeof(writer_tasks[0]), if (nwriters_stress) {
GFP_KERNEL); writer_tasks = kzalloc(cxt.nrealwriters_stress * sizeof(writer_tasks[0]),
if (writer_tasks == NULL) { GFP_KERNEL);
VERBOSE_TOROUT_ERRSTRING("writer_tasks: Out of memory"); if (writer_tasks == NULL) {
firsterr = -ENOMEM; VERBOSE_TOROUT_ERRSTRING("writer_tasks: Out of memory");
goto unwind; firsterr = -ENOMEM;
goto unwind;
}
} }
if (cxt.cur_ops->readlock) { if (cxt.cur_ops->readlock) {
......
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