Patch "efi/libstub: fix efi_random_alloc() to allocate memory at alloc_min or higher address" has been added to the 6.6-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

    efi/libstub: fix efi_random_alloc() to allocate memory at alloc_min or higher address

to the 6.6-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:
     efi-libstub-fix-efi_random_alloc-to-allocate-memory-.patch
and it can be found in the queue-6.6 subdirectory.

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



commit 2b67093b02f25779db039af6bb662bf4da6fe335
Author: KONDO KAZUMA(近藤 和真) <kazuma-kondo@xxxxxxx>
Date:   Fri Mar 22 10:47:02 2024 +0000

    efi/libstub: fix efi_random_alloc() to allocate memory at alloc_min or higher address
    
    [ Upstream commit 3cb4a4827596abc82e55b80364f509d0fefc3051 ]
    
    Following warning is sometimes observed while booting my servers:
      [    3.594838] DMA: preallocated 4096 KiB GFP_KERNEL pool for atomic allocations
      [    3.602918] swapper/0: page allocation failure: order:10, mode:0xcc1(GFP_KERNEL|GFP_DMA), nodemask=(null),cpuset=/,mems_allowed=0-1
      ...
      [    3.851862] DMA: preallocated 1024 KiB GFP_KERNEL|GFP_DMA pool for atomic allocation
    
    If 'nokaslr' boot option is set, the warning always happens.
    
    On x86, ZONE_DMA is small zone at the first 16MB of physical address
    space. When this problem happens, most of that space seems to be used by
    decompressed kernel. Thereby, there is not enough space at DMA_ZONE to
    meet the request of DMA pool allocation.
    
    The commit 2f77465b05b1 ("x86/efistub: Avoid placing the kernel below
    LOAD_PHYSICAL_ADDR") tried to fix this problem by introducing lower
    bound of allocation.
    
    But the fix is not complete.
    
    efi_random_alloc() allocates pages by following steps.
    1. Count total available slots ('total_slots')
    2. Select a slot ('target_slot') to allocate randomly
    3. Calculate a starting address ('target') to be included target_slot
    4. Allocate pages, which starting address is 'target'
    
    In step 1, 'alloc_min' is used to offset the starting address of memory
    chunk. But in step 3 'alloc_min' is not considered at all.  As the
    result, 'target' can be miscalculated and become lower than 'alloc_min'.
    
    When KASLR is disabled, 'target_slot' is always 0 and the problem
    happens everytime if the EFI memory map of the system meets the
    condition.
    
    Fix this problem by calculating 'target' considering 'alloc_min'.
    
    Cc: linux-efi@xxxxxxxxxxxxxxx
    Cc: Tom Englund <tomenglund26@xxxxxxxxx>
    Cc: linux-kernel@xxxxxxxxxxxxxxx
    Fixes: 2f77465b05b1 ("x86/efistub: Avoid placing the kernel below LOAD_PHYSICAL_ADDR")
    Signed-off-by: Kazuma Kondo <kazuma-kondo@xxxxxxx>
    Signed-off-by: Ard Biesheuvel <ardb@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/firmware/efi/libstub/randomalloc.c b/drivers/firmware/efi/libstub/randomalloc.c
index 4e96a855fdf47..7e18528595502 100644
--- a/drivers/firmware/efi/libstub/randomalloc.c
+++ b/drivers/firmware/efi/libstub/randomalloc.c
@@ -120,7 +120,7 @@ efi_status_t efi_random_alloc(unsigned long size,
 			continue;
 		}
 
-		target = round_up(md->phys_addr, align) + target_slot * align;
+		target = round_up(max(md->phys_addr, alloc_min), align) + target_slot * align;
 		pages = size / EFI_PAGE_SIZE;
 
 		status = efi_bs_call(allocate_pages, EFI_ALLOCATE_ADDRESS,




[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