Patch "selftests/vm/pkeys: fix alloc_random_pkey() to make it really, really random" has been added to the 5.13-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    selftests/vm/pkeys: fix alloc_random_pkey() to make it really, really random

to the 5.13-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     selftests-vm-pkeys-fix-alloc_random_pkey-to-make-it-.patch
and it can be found in the queue-5.13 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b60ac855fa2b5735c8e809e8424039949bdd2604
Author: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
Date:   Wed Jun 30 18:56:53 2021 -0700

    selftests/vm/pkeys: fix alloc_random_pkey() to make it really, really random
    
    [ Upstream commit f36ef407628835a7d7fb3d235b1f1aac7022d9a3 ]
    
    Patch series "selftests/vm/pkeys: Bug fixes and a new test".
    
    There has been a lot of activity on the x86 front around the XSAVE
    architecture which is used to context-switch processor state (among other
    things).  In addition, AMD has recently joined the protection keys club by
    adding processor support for PKU.
    
    The AMD implementation helped uncover a kernel bug around the PKRU "init
    state", which actually applied to Intel's implementation but was just
    harder to hit.  This series adds a test which is expected to help find
    this class of bug both on AMD and Intel.  All the work around pkeys on x86
    also uncovered a few bugs in the selftest.
    
    This patch (of 4):
    
    The "random" pkey allocation code currently does the good old:
    
            srand((unsigned int)time(NULL));
    
    *But*, it unfortunately does this on every random pkey allocation.
    
    There may be thousands of these a second.  time() has a one second
    resolution.  So, each time alloc_random_pkey() is called, the PRNG is
    *RESET* to time().  This is nasty.  Normally, if you do:
    
            srand(<ANYTHING>);
            foo = rand();
            bar = rand();
    
    You'll be quite guaranteed that 'foo' and 'bar' are different.  But, if
    you do:
    
            srand(1);
            foo = rand();
            srand(1);
            bar = rand();
    
    You are quite guaranteed that 'foo' and 'bar' are the *SAME*.  The recent
    "fix" effectively forced the test case to use the same "random" pkey for
    the whole test, unless the test run crossed a second boundary.
    
    Only run srand() once at program startup.
    
    This explains some very odd and persistent test failures I've been seeing.
    
    Link: https://lkml.kernel.org/r/20210611164153.91B76FB8@xxxxxxxxxxxxxxxxxx
    Link: https://lkml.kernel.org/r/20210611164155.192D00FF@xxxxxxxxxxxxxxxxxx
    Fixes: 6e373263ce07 ("selftests/vm/pkeys: fix alloc_random_pkey() to make it really random")
    Signed-off-by: Dave Hansen <dave.hansen@xxxxxxxxxxxxxxx>
    Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
    Tested-by: Aneesh Kumar K.V <aneesh.kumar@xxxxxxxxxxxxx>
    Cc: Ram Pai <linuxram@xxxxxxxxxx>
    Cc: Sandipan Das <sandipan@xxxxxxxxxxxxx>
    Cc: Florian Weimer <fweimer@xxxxxxxxxx>
    Cc: "Desnes A. Nunes do Rosario" <desnesn@xxxxxxxxxxxxxxxxxx>
    Cc: Ingo Molnar <mingo@xxxxxxxxxx>
    Cc: Thiago Jung Bauermann <bauerman@xxxxxxxxxxxxx>
    Cc: Michael Ellerman <mpe@xxxxxxxxxxxxxx>
    Cc: Michal Hocko <mhocko@xxxxxxxxxx>
    Cc: Michal Suchanek <msuchanek@xxxxxxx>
    Cc: Shuah Khan <shuah@xxxxxxxxxx>
    Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/tools/testing/selftests/vm/protection_keys.c b/tools/testing/selftests/vm/protection_keys.c
index fdbb602ecf32..9ee0ae5d3e06 100644
--- a/tools/testing/selftests/vm/protection_keys.c
+++ b/tools/testing/selftests/vm/protection_keys.c
@@ -561,7 +561,6 @@ int alloc_random_pkey(void)
 	int nr_alloced = 0;
 	int random_index;
 	memset(alloced_pkeys, 0, sizeof(alloced_pkeys));
-	srand((unsigned int)time(NULL));
 
 	/* allocate every possible key and make a note of which ones we got */
 	max_nr_pkey_allocs = NR_PKEYS;
@@ -1552,6 +1551,8 @@ int main(void)
 	int nr_iterations = 22;
 	int pkeys_supported = is_pkeys_supported();
 
+	srand((unsigned int)time(NULL));
+
 	setup_handlers();
 
 	printf("has pkeys: %d\n", pkeys_supported);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux