> On Jan 12, 2024, at 11:04 AM, Kinney, Michael D <michael.d.kin...@intel.com> 
> wrote:
> 
> Agreed.  Basically every API that takes an EF_HANDLE as input calls that API 
> to make sure it is a valid handle.
>  
> The first question is if we get value from making sure the EFI_HANDLE is a 
> member of the active set of handles.
>  
> A simple signature check in the EFI_HANDLE may be enough as long as all freed 
> handles clear the signature.
>  
> Then, the only way that the linked list walk adds value is if there it a call 
> with an invalid handle that happens to
> have the matching signature.
>  

MIke,

I seem to remember we ended up fixing the way you describe locally. Even if you 
convert the list into a tree given the index was a pointer to allocate memory 
it could get reused. The tree just made the lookup go faster. 

If we wanted to get tricky on 64-bit systems we could encode a monotonically 
increasing number in the non-canonical part of the virtual address, or above 
the max physical address if paging is not enabled. To use the EFI_HNDLE as a 
pointer you just remove count and replace it with sign extend canonical address 
(zero in our case). We could probably define a HOB to define the bits to use 
given the code constructing the page tables for DXE needs to know all the rules 
here. 

Thanks,

Andrew Fish

> The 
>  
> From: Andrew (EFI) Fish <af...@apple.com> 
> Sent: Friday, January 12, 2024 10:57 AM
> To: edk2-devel-groups-io <devel@edk2.groups.io>; Kinney, Michael D 
> <michael.d.kin...@intel.com>
> Cc: pedro.falc...@gmail.com; Laszlo Ersek <ler...@redhat.com>; 
> n...@os.amperecomputing.com; ardb+tianoc...@kernel.org
> Subject: Re: [edk2-devel] Memory Attribute for depex section
>  
>  
> 
> 
> On Jan 12, 2024, at 8:37 AM, Michael D Kinney <michael.d.kin...@intel.com 
> <mailto:michael.d.kin...@intel.com>> wrote:
>  
> Hi Pedro,
> 
> Thank you for evaluating this idea change from linked list to improve
> performance of the handle database.
> 
> The concept of using integers for an EFI_HANDLE has been considered before.
> One advantage over pointers is that a guarantee can be made that an EFI_HANDLE
> value can be guaranteed to be unique.  In the current implementation with
> EFI_HANDLE being a pointer to an allocated buffer, an EFI_HANDLE value could
> potentially be reused if an EFI_HANDLE is freed and later allocated for a 
> different EFI_HANDLE.
> 
> If you continue to explore this path I agree that EFI_HANDLE value of 0 should
> be reserved and never used.  I also recommend that new EFI_HANDLE values are
> always assigned a new unique value that freed EFI_HANDLE values are never 
> reused.
> 
> The overall linked list performance of the handle database has also been noted
> before, but has rarely raised to the level where it impacts the overall boot
> performance relative to other optimization opportunities.  I look forward to
> the performance data.  The PERF_X() macros are the right service to use.  On
> x86 it is based on the time stamp counter (TSC) which has very small 
> granularity.
> 
>  
> Mike,
>  
> We tracked this a while back with the PERF macros when we had some 
> performance issues running diagnostics on a system with 3,000+ handles. The 
> hot path was CoreValidateHandle(). I think the number of calls to 
> CoreValidateHandle() explodes if you have more handles so it is not just the 
> raw performance of CoreValidateHandle(), but also how many times it gets 
> called. 
>  
> Thanks,
>  
> Andrew Fish
> 
> 
> Mike
> 
> 
> 
> -----Original Message-----
> From: devel@edk2.groups.io <mailto:devel@edk2.groups.io> 
> <devel@edk2.groups.io <mailto:devel@edk2.groups.io>> On Behalf Of Pedro 
> Falcato
> Sent: Friday, January 12, 2024 6:47 AM
> To: Laszlo Ersek <ler...@redhat.com <mailto:ler...@redhat.com>>
> Cc: devel@edk2.groups.io <mailto:devel@edk2.groups.io>; 
> n...@os.amperecomputing.com <mailto:n...@os.amperecomputing.com>;
> ardb+tianoc...@kernel.org <mailto:ardb+tianoc...@kernel.org>; Andrew Fish 
> <af...@apple.com <mailto:af...@apple.com>>
> Subject: Re: [edk2-devel] Memory Attribute for depex section
> 
> On Fri, Jan 12, 2024 at 9:35 AM Laszlo Ersek <ler...@redhat.com 
> <mailto:ler...@redhat.com>> wrote:
> 
> 
> On 1/12/24 03:10, Pedro Falcato wrote:
> 
> My idea was to make each handle an index - like a file descriptor -
> AFAIK there's no reason why it *needs* to be an actual pointer.
> We'd allocate indices when creating a handle, and return that (casted to
> VOID*).
> 
> 
> Huh, sneaky.
> 
> I see two potential problems with this.
> 
> First, per C std, these "pointers" would be invalid (they wouldn't
> actually point to valid memory), so even just evaluating them (not
> dereferencing them!) would invoke undefined behavior. May or may not
> matter in practice. With compilers getting smarter about optimization
> (and stricter about std conformance), there could be issues, perhaps.
> 
> This is true. Stashing random integers in pointers is
> implementation-defined. But it's also super common. Win32 HANDLEs are
> exactly this, just integers (stashed in VOID*). The Linux kernel world
> also has a bunch of fun tricks with stashing flags in a pointer's
> bottom bits, magic pointer values, etc. I severely doubt we can run
> into issues with this. EDK2 will not exactly run on the C standard's
> abstract machine anyway ;)
> 
> 
> 
> The other concern is a bit contrived, but I *guess* there could be code
> out there that actually dereferences EFI_HANDLEs. That code would crash.
> May or may not matter, because such code is arguably already
> semantically invalid. (It would not necessarily be invalid at the
> language level -- cf. my previous paragraph --, because passing an
> otherwise valid EFI_HANDLE to CopyMem, for copying just 1 byte out of
> the underlying opaque data structure, would not violate the language.)
> 
> This is a feature, not a bug! :P
> 
> Seriously though, IHANDLE is not even exposed in semi-public headers,
> so any code that's derefing an EFI_HANDLE will need to do something
> like
> 
> typedef struct {
>  /* ... */
> } IHANDLE;
> 
> EFI_HANDLE Handle = /* ... */;
> 
> IHANDLE *HandleImpl = (IHANDLE *) Handle;
> 
> and I'm a strong believer in "play stupid games, win stupid prizes".
> You can definitely make an argument for "this should definitely crash"
> instead of just "maybe crashing" (for instance, platforms that still
> map the NULL page (like OVMF!), or handles > 4096), so I'm inclined to
> think that if we indeed go this route, we should set one or two upper
> bits (on 64-bit platforms!) to make handles non-canonical addresses
> and therefore necessarily crash on dereference.
> 
> 
> 
> 
> I should note that I find it super hard to get a concrete idea on
> performance for EFI firmware without adequate tooling - I meant to
> write a standalone flamegraph tool a few weeks back (even posted in
> edk2-devel), but, as far as I could tell, the architectural timer
> protocol couldn't get me the interrupt frame[1]. Until then, whether
> any of this radix tree vs RB tree vs flat array stuff really
> matters... I find it hard to say.
> 
> [1] x86 has 3 timers (PIT, LAPIC timer, HPET) and performance
> monitoring interrupts, and I couldn't freely use any of them :^)
> 
> Edk2 has some form of profiling already (see
> "MdePkg/Include/Library/PerformanceLib.h"). Usually one sees core code
> peppered with PERF_CODE_BEGIN and PERF_CODE_END macros. I *think* there
> is something like a "display performance" (dp) shell application too,
> that can show the collected stats. But I've never used these facilities.
> 
> The wiki seems to have two related articles:
> 
> https://github.com/tianocore/tianocore.github.io/wiki/Edk2-Performance-
> Infrastructure
> 
> 
> https://github.com/tianocore/tianocore.github.io/wiki/PerformancePkg
> 
> The former looks quite comprehensive, at a quick skim.
> 
> /me nods
> I've seen those macros around, but I've never used them.
> In any case, this problem has piqued my interest, I'll see if I can
> find some free time this weekend to hack on a test benchmark and a PoC
> :)
> 
> --
> Pedro
> 
> 
> 
> 
> 
> 
> 
> 



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#113775): https://edk2.groups.io/g/devel/message/113775
Mute This Topic: https://groups.io/mt/103594587/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: 
https://edk2.groups.io/g/devel/leave/9847357/21656/1706620634/xyzzy 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to