From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 1745981895 for ; Sun, 26 Feb 2017 22:43:13 -0800 (PST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Feb 2017 22:43:12 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,213,1484035200"; d="scan'208";a="1135316584" Received: from fmsmsx106.amr.corp.intel.com ([10.18.124.204]) by fmsmga002.fm.intel.com with ESMTP; 26 Feb 2017 22:43:12 -0800 Received: from fmsmsx158.amr.corp.intel.com (10.18.116.75) by FMSMSX106.amr.corp.intel.com (10.18.124.204) with Microsoft SMTP Server (TLS) id 14.3.248.2; Sun, 26 Feb 2017 22:43:12 -0800 Received: from shsmsx152.ccr.corp.intel.com (10.239.6.52) by fmsmsx158.amr.corp.intel.com (10.18.116.75) with Microsoft SMTP Server (TLS) id 14.3.248.2; Sun, 26 Feb 2017 22:43:12 -0800 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.88]) by SHSMSX152.ccr.corp.intel.com ([169.254.6.132]) with mapi id 14.03.0248.002; Mon, 27 Feb 2017 14:43:11 +0800 From: "Gao, Liming" To: Ard Biesheuvel , "edk2-devel@lists.01.org" , "Yao, Jiewen" , "leif.lindholm@linaro.org" CC: "afish@apple.com" , "Kinney, Michael D" , "lersek@redhat.com" , "Tian, Feng" , "Zeng, Star" Thread-Topic: [PATCH v3 4/6] MdeModulePkg/DxeCore: use separate lock for pool allocations Thread-Index: AQHSkF5zNsdCm6OKkEG93AlS4OXDd6F8XCKA Date: Mon, 27 Feb 2017 06:43:10 +0000 Message-ID: <4A89E2EF3DFEDB4C8BFDE51014F606A14D6E4EAA@shsmsx102.ccr.corp.intel.com> References: <1488133805-4773-1-git-send-email-ard.biesheuvel@linaro.org> <1488133805-4773-5-git-send-email-ard.biesheuvel@linaro.org> In-Reply-To: <1488133805-4773-5-git-send-email-ard.biesheuvel@linaro.org> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 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: Mon, 27 Feb 2017 06:43:13 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Ard: I agree to separate lock for pool allocations. I suggest you update CoreA= llocatePoolPages() and CoreFreePoolPages() implementation by adding CoreAcq= uireMemoryLock() and CoreReleaseMemoryLock(). If so, you don't need to intr= oduce new CoreAllocatePoolPagesI () and CoreFreePoolPagesI ().=20 Thanks Liming >-----Original Message----- >From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org] >Sent: Monday, February 27, 2017 2:30 AM >To: edk2-devel@lists.01.org; Yao, Jiewen ; >leif.lindholm@linaro.org >Cc: afish@apple.com; Kinney, Michael D ; Gao, >Liming ; lersek@redhat.com; Tian, Feng >; Zeng, Star ; Ard Biesheuvel > >Subject: [PATCH v3 4/6] MdeModulePkg/DxeCore: use separate lock for pool >allocations > >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 =3D 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 =3D CoreAcquireLockOrFail (&gMemoryLock); >+ Status =3D CoreAcquireLockOrFail (&mPoolMemoryLock); > if (EFI_ERROR (Status)) { > return EFI_OUT_OF_RESOURCES; > } > > *Buffer =3D CoreAllocatePoolI (PoolType, Size); >- CoreReleaseMemoryLock (); >+ CoreReleaseLock (&mPoolMemoryLock); > return (*Buffer !=3D 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 (); >+ Buffer =3D 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 =3D=3D EfiACPIReclaimMemory || > PoolType =3D=3D EfiACPIMemoryNVS || >@@ -355,7 +374,7 @@ CoreAllocatePoolI ( > if (Index >=3D SIZE_TO_LIST (Granularity)) { > NoPages =3D EFI_SIZE_TO_PAGES(Size) + EFI_SIZE_TO_PAGES (Granularity)= - >1; > NoPages &=3D ~(UINTN)(EFI_SIZE_TO_PAGES (Granularity) - 1); >- Head =3D CoreAllocatePoolPages (PoolType, NoPages, Granularity); >+ Head =3D CoreAllocatePoolPagesI (PoolType, NoPages, Granularity); > goto Done; > } > >@@ -383,7 +402,7 @@ CoreAllocatePoolI ( > // > // Get another page > // >- NewPage =3D CoreAllocatePoolPages(PoolType, EFI_SIZE_TO_PAGES >(Granularity), Granularity); >+ NewPage =3D CoreAllocatePoolPagesI (PoolType, EFI_SIZE_TO_PAGES >(Granularity), Granularity); > if (NewPage =3D=3D NULL) { > goto Done; > } >@@ -486,9 +505,9 @@ CoreInternalFreePool ( > return EFI_INVALID_PARAMETER; > } > >- CoreAcquireMemoryLock (); >+ CoreAcquireLock (&mPoolMemoryLock); > Status =3D 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 =3D=3D POOL_TAIL_SIGNATURE); > ASSERT (Head->Size =3D=3D Tail->Size); >- ASSERT_LOCKED (&gMemoryLock); >+ ASSERT_LOCKED (&mPoolMemoryLock); > > if (Tail->Signature !=3D POOL_TAIL_SIGNATURE) { > return EFI_INVALID_PARAMETER; >@@ -624,7 +656,7 @@ CoreFreePoolI ( > // > NoPages =3D EFI_SIZE_TO_PAGES(Size) + EFI_SIZE_TO_PAGES (Granularity)= - >1; > NoPages &=3D ~(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