Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2ce77d16 authored by Davidlohr Bueso's avatar Davidlohr Bueso Committed by Paul E. McKenney
Browse files

locking/locktorture: Fix num reader/writer corner cases



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>
parent f2f76260
Loading
Loading
Loading
Loading
+44 −32
Original line number Diff line number Diff line
@@ -703,8 +703,7 @@ static void __torture_print_stats(char *page,
{
	bool fail = 0;
	int i, n_stress;
	long max = 0;
	long min = statp[0].n_lock_acquired;
	long max = 0, min = statp ? statp[0].n_lock_acquired : 0;
	long long sum = 0;

	n_stress = write ? cxt.nrealwriters_stress : cxt.nrealreaders_stress;
@@ -811,7 +810,7 @@ static void lock_torture_cleanup(void)
	 * such, only perform the underlying torture-specific cleanups,
	 * and avoid anything related to locktorture.
	 */
	if (!cxt.lwsa)
	if (!cxt.lwsa && !cxt.lrsa)
		goto end;

	if (writer_tasks) {
@@ -886,6 +885,13 @@ static int __init lock_torture_init(void)
		firsterr = -EINVAL;
		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)
		cxt.cur_ops->init();

@@ -909,7 +915,7 @@ static int __init lock_torture_init(void)
#endif

	/* 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) {
@@ -917,10 +923,12 @@ static int __init lock_torture_init(void)
			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 (nreaders_stress >= 0)
@@ -936,6 +944,7 @@ static int __init lock_torture_init(void)
			cxt.nrealreaders_stress = cxt.nrealwriters_stress;
		}

		if (nreaders_stress) {
			lock_is_read_held = 0;
			cxt.lrsa = kmalloc(sizeof(*cxt.lrsa) * cxt.nrealreaders_stress, GFP_KERNEL);
			if (cxt.lrsa == NULL) {
@@ -951,6 +960,7 @@ static int __init lock_torture_init(void)
				cxt.lrsa[i].n_lock_acquired = 0;
			}
		}
	}

	lock_torture_print_module_parms(cxt.cur_ops, "Start of test");

@@ -978,6 +988,7 @@ static int __init lock_torture_init(void)
			goto unwind;
	}

	if (nwriters_stress) {
		writer_tasks = kzalloc(cxt.nrealwriters_stress * sizeof(writer_tasks[0]),
				       GFP_KERNEL);
		if (writer_tasks == NULL) {
@@ -985,6 +996,7 @@ static int __init lock_torture_init(void)
			firsterr = -ENOMEM;
			goto unwind;
		}
	}

	if (cxt.cur_ops->readlock) {
		reader_tasks = kzalloc(cxt.nrealreaders_stress * sizeof(reader_tasks[0]),