From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) (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 BCAC2821A2 for ; Sun, 26 Feb 2017 17:56:59 -0800 (PST) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Feb 2017 17:56:59 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,211,1484035200"; d="scan'208";a="1115899806" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga001.fm.intel.com with ESMTP; 26 Feb 2017 17:56:59 -0800 Received: from shsmsx151.ccr.corp.intel.com (10.239.6.50) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.248.2; Sun, 26 Feb 2017 17:56:58 -0800 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.88]) by SHSMSX151.ccr.corp.intel.com ([169.254.3.204]) with mapi id 14.03.0248.002; Mon, 27 Feb 2017 09:56:55 +0800 From: "Zeng, Star" To: Ard Biesheuvel , "edk2-devel@lists.01.org" , "Yao, Jiewen" , "leif.lindholm@linaro.org" CC: "Tian, Feng" , "afish@apple.com" , "Gao, Liming" , "Kinney, Michael D" , "lersek@redhat.com" , "Zeng, Star" Thread-Topic: [edk2] [PATCH v3 4/6] MdeModulePkg/DxeCore: use separate lock for pool allocations Thread-Index: AQHSkF513ed2vNC51UmcofKTmeXmxqF8GF2w Date: Mon, 27 Feb 2017 01:56:54 +0000 Message-ID: <0C09AFA07DD0434D9E2A0C6AEB0483103B82C082@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: zh-CN, 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 01:56:59 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Minor comment: CoreFreePoolPagesI() has no need to have PoolType parameter,= how about to remove it? Thanks, Star -----Original Message----- From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Ard = Biesheuvel Sent: Monday, February 27, 2017 2:30 AM To: edk2-devel@lists.01.org; Yao, Jiewen ; leif.lindh= olm@linaro.org Cc: Tian, Feng ; Ard Biesheuvel ; afish@apple.com; Gao, Liming ; Kinney, Michael= D ; lersek@redhat.com; Zeng, Star Subject: [edk2] [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 int= erfere with the page allocation bookkeeping if pool pages are allocated or = released. But it is also required to ensure that the permission attribute m= anagement does not deadlock, given that it may trigger page table splits le= ading 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/P= ool.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" =20 +STATIC EFI_LOCK mPoolMemoryLock =3D EFI_INITIALIZE_LOCK_VARIABLE=20 +(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; } =20 *Buffer =3D CoreAllocatePoolI (PoolType, Size); - CoreReleaseMemoryLock (); + CoreReleaseLock (&mPoolMemoryLock); return (*Buffer !=3D NULL) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES; } =20 @@ -289,6 +291,23 @@ CoreAllocatePool ( return Status; } =20 +STATIC +VOID * +CoreAllocatePoolPagesI ( + IN EFI_MEMORY_TYPE PoolType, + IN UINTN NoPages, + IN UINTN Granularity + ) +{ + VOID *Buffer; + + CoreAcquireMemoryLock (); + Buffer =3D CoreAllocatePoolPages (PoolType, NoPages, Granularity); =20 + CoreReleaseMemoryLock (); + + return Buffer; +} + /** Internal function to allocate pool of a particular type. Caller must have the memory lock held @@ -317,7 +336,7 @@ CoreAllocatePo= olI ( UINTN NoPages; UINTN Granularity; =20 - ASSERT_LOCKED (&gMemoryLock); + ASSERT_LOCKED (&mPoolMemoryLock); =20 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; } =20 @@ -383,7 +402,7 @@ CoreAllocatePoolI ( // // Get another page // - NewPage =3D CoreAllocatePoolPages(PoolType, EFI_SIZE_TO_PAGES (Granula= rity), Granularity); + NewPage =3D CoreAllocatePoolPagesI (PoolType, EFI_SIZE_TO_PAGES=20 + (Granularity), Granularity); if (NewPage =3D=3D NULL) { goto Done; } @@ -486,9 +505,9 @@ CoreInternalFreePool ( return EFI_INVALID_PARAMETER; } =20 - CoreAcquireMemoryLock (); + CoreAcquireLock (&mPoolMemoryLock); Status =3D CoreFreePoolI (Buffer, PoolType); - CoreReleaseMemoryLock (); + CoreReleaseLock (&mPoolMemoryLock); return Status; } =20 @@ -525,6 +544,19 @@ CoreFreePool ( return Status; } =20 +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); =20 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)=20 + (UINTN) Head, NoPages); =20 } else { =20 @@ -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) (UINT= N)NewPage, + EFI_SIZE_TO_PAGES (Granularity)); } } } -- 2.7.4 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel