From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io0-x233.google.com (mail-io0-x233.google.com [IPv6:2607:f8b0:4001:c06::233]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 5279B820EB for ; Sun, 26 Feb 2017 11:52:07 -0800 (PST) Received: by mail-io0-x233.google.com with SMTP id l7so7229840ioe.3 for ; Sun, 26 Feb 2017 11:52:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=0wvycRKV4qKBrv0XPyfBV7XTVIzSnQW5w1AQ0I8LZns=; b=dYJCapsrpuTmPA/V85L2/+Xje4HSNZs1gdcSScp8wF47yH9JJzOtbCYwKlA+mxwAD3 6aq5CirSWvaNkOAVv3kywvG0NPbDl0vazI0TPGYxcEU2ObFK+/7VhoKmxQ4/739dh9Sx SaNgvP0LQy2ytopNKXFuZmTADOBb1q8rVOWKw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=0wvycRKV4qKBrv0XPyfBV7XTVIzSnQW5w1AQ0I8LZns=; b=Hnp0vhERtyj0DQRy38LLOtbzCTj4P0Ezz+bnkLSbRntnmjTr8r5DtGhHydwLs5ETOK eeCsmFFPB3JG+wMCospt4MVHXj+qn2533y6Oi6dG8zkUzbbglYfQhoa2zG6/SuEZwoXO KuXB0GU2olHW8mqkmZtPs9ZZ+HToobnk6XeX9mXMGjE3uYglmEwxgaIy6DQ9ZJ3snjBm bsnRkNr6W2hpU5Xj9pPCwRQHn8P6NtAxyfzl/O6iAyk9uuxJMrA+UQx7eNvqlAM5Z6hJ Yl/O5zF8k/ZB+nrNqnYdGHF5lQPR7nL87D8BQWKc139zj7EORv4nwGsZQTuJ4jPugyPc Xm0g== X-Gm-Message-State: AMke39n3biRHrWCb+1tWmI6SNdHEVgjvvO7UZWF6vG9TIVHsOBGiSIGqRlhfbzAXlRVxcVfqJrwWCbpObVIU/O+D X-Received: by 10.107.132.155 with SMTP id o27mr12037ioi.138.1488138726577; Sun, 26 Feb 2017 11:52:06 -0800 (PST) MIME-Version: 1.0 Received: by 10.107.198.134 with HTTP; Sun, 26 Feb 2017 11:52:06 -0800 (PST) In-Reply-To: <1488133805-4773-5-git-send-email-ard.biesheuvel@linaro.org> References: <1488133805-4773-1-git-send-email-ard.biesheuvel@linaro.org> <1488133805-4773-5-git-send-email-ard.biesheuvel@linaro.org> From: Ard Biesheuvel Date: Sun, 26 Feb 2017 19:52:06 +0000 Message-ID: To: "edk2-devel@lists.01.org" , "Yao, Jiewen" , Leif Lindholm Cc: "afish@apple.com" , "Kinney, Michael D" , "Gao, Liming" , Laszlo Ersek , "Tian, Feng" , "Zeng, Star" , Ard Biesheuvel Subject: Re: [PATCH v3 4/6] MdeModulePkg/DxeCore: use separate lock for pool allocations X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Feb 2017 19:52:07 -0000 Content-Type: text/plain; charset=UTF-8 On 26 February 2017 at 18:30, Ard Biesheuvel wrote: > In preparation of adding memory permission attribute management to > the pool allocator, split off the locking of the pool metadata into > a separate lock. This is an improvement in itself, given that pool > allocation can only interfere with the page allocation bookkeeping > if pool pages are allocated or released. But it is also required to > ensure that the permission attribute management does not deadlock, > given that it may trigger page table splits leading to additional > page tables being allocated. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Ard Biesheuvel > --- > MdeModulePkg/Core/Dxe/Mem/Pool.c | 53 ++++++++++++++++---- > 1 file changed, 43 insertions(+), 10 deletions(-) > > diff --git a/MdeModulePkg/Core/Dxe/Mem/Pool.c b/MdeModulePkg/Core/Dxe/Mem/Pool.c > index 7afd2d312c1d..410615e0dee9 100644 > --- a/MdeModulePkg/Core/Dxe/Mem/Pool.c > +++ b/MdeModulePkg/Core/Dxe/Mem/Pool.c > @@ -15,6 +15,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > #include "DxeMain.h" > #include "Imem.h" > > +STATIC EFI_LOCK mPoolMemoryLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_NOTIFY); > + > #define POOL_FREE_SIGNATURE SIGNATURE_32('p','f','r','0') > typedef struct { > UINT32 Signature; > @@ -239,13 +241,13 @@ CoreInternalAllocatePool ( > // > // Acquire the memory lock and make the allocation > // > - Status = CoreAcquireLockOrFail (&gMemoryLock); > + Status = CoreAcquireLockOrFail (&mPoolMemoryLock); > if (EFI_ERROR (Status)) { > return EFI_OUT_OF_RESOURCES; > } > > *Buffer = CoreAllocatePoolI (PoolType, Size); > - CoreReleaseMemoryLock (); > + CoreReleaseLock (&mPoolMemoryLock); > return (*Buffer != NULL) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES; > } > > @@ -289,6 +291,23 @@ CoreAllocatePool ( > return Status; > } > > +STATIC > +VOID * > +CoreAllocatePoolPagesI ( > + IN EFI_MEMORY_TYPE PoolType, > + IN UINTN NoPages, > + IN UINTN Granularity > + ) > +{ > + VOID *Buffer; > + > + CoreAcquireMemoryLock (); This should probably be EFI_STATUS Status; Status = CoreAcquireLockOrFail (&gMemoryLock); if (EFI_ERROR (Status)) { return NULL; } to preserve the old behavior. > + Buffer = CoreAllocatePoolPages (PoolType, NoPages, Granularity); > + CoreReleaseMemoryLock (); > + > + return Buffer; > +} > + > /** > Internal function to allocate pool of a particular type. > Caller must have the memory lock held > @@ -317,7 +336,7 @@ CoreAllocatePoolI ( > UINTN NoPages; > UINTN Granularity; > > - ASSERT_LOCKED (&gMemoryLock); > + ASSERT_LOCKED (&mPoolMemoryLock); > > if (PoolType == EfiACPIReclaimMemory || > PoolType == EfiACPIMemoryNVS || > @@ -355,7 +374,7 @@ CoreAllocatePoolI ( > if (Index >= SIZE_TO_LIST (Granularity)) { > NoPages = EFI_SIZE_TO_PAGES(Size) + EFI_SIZE_TO_PAGES (Granularity) - 1; > NoPages &= ~(UINTN)(EFI_SIZE_TO_PAGES (Granularity) - 1); > - Head = CoreAllocatePoolPages (PoolType, NoPages, Granularity); > + Head = CoreAllocatePoolPagesI (PoolType, NoPages, Granularity); > goto Done; > } > > @@ -383,7 +402,7 @@ CoreAllocatePoolI ( > // > // Get another page > // > - NewPage = CoreAllocatePoolPages(PoolType, EFI_SIZE_TO_PAGES (Granularity), Granularity); > + NewPage = CoreAllocatePoolPagesI (PoolType, EFI_SIZE_TO_PAGES (Granularity), Granularity); > if (NewPage == NULL) { > goto Done; > } > @@ -486,9 +505,9 @@ CoreInternalFreePool ( > return EFI_INVALID_PARAMETER; > } > > - CoreAcquireMemoryLock (); > + CoreAcquireLock (&mPoolMemoryLock); > Status = CoreFreePoolI (Buffer, PoolType); > - CoreReleaseMemoryLock (); > + CoreReleaseLock (&mPoolMemoryLock); > return Status; > } > > @@ -525,6 +544,19 @@ CoreFreePool ( > return Status; > } > > +STATIC > +VOID > +CoreFreePoolPagesI ( > + IN EFI_MEMORY_TYPE PoolType, > + IN EFI_PHYSICAL_ADDRESS Memory, > + IN UINTN NoPages > + ) > +{ > + CoreAcquireMemoryLock (); > + CoreFreePoolPages (Memory, NoPages); > + CoreReleaseMemoryLock (); > +} > + > /** > Internal function to free a pool entry. > Caller must have the memory lock held > @@ -573,7 +605,7 @@ CoreFreePoolI ( > // > ASSERT (Tail->Signature == POOL_TAIL_SIGNATURE); > ASSERT (Head->Size == Tail->Size); > - ASSERT_LOCKED (&gMemoryLock); > + ASSERT_LOCKED (&mPoolMemoryLock); > > if (Tail->Signature != POOL_TAIL_SIGNATURE) { > return EFI_INVALID_PARAMETER; > @@ -624,7 +656,7 @@ CoreFreePoolI ( > // > NoPages = EFI_SIZE_TO_PAGES(Size) + EFI_SIZE_TO_PAGES (Granularity) - 1; > NoPages &= ~(UINTN)(EFI_SIZE_TO_PAGES (Granularity) - 1); > - CoreFreePoolPages ((EFI_PHYSICAL_ADDRESS) (UINTN) Head, NoPages); > + CoreFreePoolPagesI (Pool->MemoryType, (EFI_PHYSICAL_ADDRESS) (UINTN) Head, NoPages); > > } else { > > @@ -680,7 +712,8 @@ CoreFreePoolI ( > // > // Free the page > // > - CoreFreePoolPages ((EFI_PHYSICAL_ADDRESS) (UINTN)NewPage, EFI_SIZE_TO_PAGES (Granularity)); > + CoreFreePoolPagesI (Pool->MemoryType, (EFI_PHYSICAL_ADDRESS) (UINTN)NewPage, > + EFI_SIZE_TO_PAGES (Granularity)); > } > } > } > -- > 2.7.4 >