Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 fixes from Thomas Gleixner: "A set of fixes for x86: - Fix the swapped outb() parameters in the KASLR code - Fix the PKEY handling at fork which missed to preserve the pkey state for the child. Comes with a test case to validate that. - Fix the entry stack handling for XEN PV to respect that XEN PV systems enter the function already on the current thread stack and not on the trampoline. - Fix kexec load failure caused by using a stale value when the kexec_buf structure is reused for subsequent allocations. - Fix a bogus sizeof() in the memory encryption code - Enforce PCI dependency for the Intel Low Power Subsystem - Enforce PCI_LOCKLESS_CONFIG when PCI is enabled" * 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/Kconfig: Select PCI_LOCKLESS_CONFIG if PCI is enabled x86/entry/64/compat: Fix stack switching for XEN PV x86/kexec: Fix a kexec_file_load() failure x86/mm/mem_encrypt: Fix erroneous sizeof() x86/selftests/pkeys: Fork() to check for state being preserved x86/pkeys: Properly copy pkey state at fork() x86/kaslr: Fix incorrect i8254 outb() parameters x86/intel/lpss: Make PCI dependency explicit
This commit is contained in:
@@ -1133,6 +1133,21 @@ void test_pkey_syscalls_bad_args(int *ptr, u16 pkey)
|
||||
pkey_assert(err);
|
||||
}
|
||||
|
||||
void become_child(void)
|
||||
{
|
||||
pid_t forkret;
|
||||
|
||||
forkret = fork();
|
||||
pkey_assert(forkret >= 0);
|
||||
dprintf3("[%d] fork() ret: %d\n", getpid(), forkret);
|
||||
|
||||
if (!forkret) {
|
||||
/* in the child */
|
||||
return;
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* Assumes that all pkeys other than 'pkey' are unallocated */
|
||||
void test_pkey_alloc_exhaust(int *ptr, u16 pkey)
|
||||
{
|
||||
@@ -1141,7 +1156,7 @@ void test_pkey_alloc_exhaust(int *ptr, u16 pkey)
|
||||
int nr_allocated_pkeys = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NR_PKEYS*2; i++) {
|
||||
for (i = 0; i < NR_PKEYS*3; i++) {
|
||||
int new_pkey;
|
||||
dprintf1("%s() alloc loop: %d\n", __func__, i);
|
||||
new_pkey = alloc_pkey();
|
||||
@@ -1152,20 +1167,26 @@ void test_pkey_alloc_exhaust(int *ptr, u16 pkey)
|
||||
if ((new_pkey == -1) && (errno == ENOSPC)) {
|
||||
dprintf2("%s() failed to allocate pkey after %d tries\n",
|
||||
__func__, nr_allocated_pkeys);
|
||||
break;
|
||||
} else {
|
||||
/*
|
||||
* Ensure the number of successes never
|
||||
* exceeds the number of keys supported
|
||||
* in the hardware.
|
||||
*/
|
||||
pkey_assert(nr_allocated_pkeys < NR_PKEYS);
|
||||
allocated_pkeys[nr_allocated_pkeys++] = new_pkey;
|
||||
}
|
||||
pkey_assert(nr_allocated_pkeys < NR_PKEYS);
|
||||
allocated_pkeys[nr_allocated_pkeys++] = new_pkey;
|
||||
|
||||
/*
|
||||
* Make sure that allocation state is properly
|
||||
* preserved across fork().
|
||||
*/
|
||||
if (i == NR_PKEYS*2)
|
||||
become_child();
|
||||
}
|
||||
|
||||
dprintf3("%s()::%d\n", __func__, __LINE__);
|
||||
|
||||
/*
|
||||
* ensure it did not reach the end of the loop without
|
||||
* failure:
|
||||
*/
|
||||
pkey_assert(i < NR_PKEYS*2);
|
||||
|
||||
/*
|
||||
* There are 16 pkeys supported in hardware. Three are
|
||||
* allocated by the time we get here:
|
||||
|
Reference in New Issue
Block a user