Commit 5e21f2d5 authored by Uladzislau Rezki (Sony)'s avatar Uladzislau Rezki (Sony) Committed by akpm

lib/test_vmalloc: switch to prandom_u32()

A get_random_bytes() function can cause a high contention if it is called
across CPUs simultaneously.  Because it shares one lock per all CPUs:

<snip>
   class name     con-bounces  contentions   waittime-min   waittime-max waittime-total   waittime-avg    acq-bounces   acquisitions   holdtime-min   holdtime-max holdtime-total   holdtime-avg
   &crng->lock:   663145       665886        0.05           8.85         261966.66        0.39            7188152       13731279       0.04           11.89        2181582.30       0.16
   -----------
   &crng->lock    307835       [<00000000acba59cd>] _extract_crng+0x48/0x90
   &crng->lock    358051       [<00000000f0075abc>] _crng_backtrack_protect+0x32/0x90
   -----------
   &crng->lock    234241       [<00000000f0075abc>] _crng_backtrack_protect+0x32/0x90
   &crng->lock    431645       [<00000000acba59cd>] _extract_crng+0x48/0x90
<snip>

Switch from the get_random_bytes() to prandom_u32() that does not have any
internal contention when a random value is needed for the tests.

The reason is to minimize CPU cycles introduced by the test-suite itself
from the vmalloc performance metrics.

Link: https://lkml.kernel.org/r/20220607093449.3100-6-urezki@gmail.comSigned-off-by: default avatarUladzislau Rezki (Sony) <urezki@gmail.com>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Matthew Wilcox <willy@infradead.org>
Cc: Nicholas Piggin <npiggin@gmail.com>
Cc: Oleksiy Avramchenko <oleksiy.avramchenko@sony.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 899c6efe
...@@ -74,12 +74,13 @@ test_report_one_done(void) ...@@ -74,12 +74,13 @@ test_report_one_done(void)
static int random_size_align_alloc_test(void) static int random_size_align_alloc_test(void)
{ {
unsigned long size, align, rnd; unsigned long size, align;
unsigned int rnd;
void *ptr; void *ptr;
int i; int i;
for (i = 0; i < test_loop_count; i++) { for (i = 0; i < test_loop_count; i++) {
get_random_bytes(&rnd, sizeof(rnd)); rnd = prandom_u32();
/* /*
* Maximum 1024 pages, if PAGE_SIZE is 4096. * Maximum 1024 pages, if PAGE_SIZE is 4096.
...@@ -150,7 +151,7 @@ static int random_size_alloc_test(void) ...@@ -150,7 +151,7 @@ static int random_size_alloc_test(void)
int i; int i;
for (i = 0; i < test_loop_count; i++) { for (i = 0; i < test_loop_count; i++) {
get_random_bytes(&n, sizeof(i)); n = prandom_u32();
n = (n % 100) + 1; n = (n % 100) + 1;
p = vmalloc(n * PAGE_SIZE); p = vmalloc(n * PAGE_SIZE);
...@@ -294,14 +295,14 @@ pcpu_alloc_test(void) ...@@ -294,14 +295,14 @@ pcpu_alloc_test(void)
for (i = 0; i < 35000; i++) { for (i = 0; i < 35000; i++) {
unsigned int r; unsigned int r;
get_random_bytes(&r, sizeof(i)); r = prandom_u32();
size = (r % (PAGE_SIZE / 4)) + 1; size = (r % (PAGE_SIZE / 4)) + 1;
/* /*
* Maximum PAGE_SIZE * Maximum PAGE_SIZE
*/ */
get_random_bytes(&r, sizeof(i)); r = prandom_u32();
align = 1 << ((i % 11) + 1); align = 1 << ((r % 11) + 1);
pcpu[i] = __alloc_percpu(size, align); pcpu[i] = __alloc_percpu(size, align);
if (!pcpu[i]) if (!pcpu[i])
...@@ -396,7 +397,7 @@ static void shuffle_array(int *arr, int n) ...@@ -396,7 +397,7 @@ static void shuffle_array(int *arr, int n)
int i, j; int i, j;
for (i = n - 1; i > 0; i--) { for (i = n - 1; i > 0; i--) {
get_random_bytes(&rnd, sizeof(rnd)); rnd = prandom_u32();
/* Cut the range. */ /* Cut the range. */
j = rnd % i; j = rnd % i;
......
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