[RFC PATCH 0/2] Clean up protocol installation API

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Oct 6 08:55:09 CEST 2022


Hi Akashi-san,

On Thu, 6 Oct 2022 at 04:35, AKASHI Takahiro <takahiro.akashi at linaro.org> wrote:
>
> Hi Ilias,
>
> On Wed, Oct 05, 2022 at 06:26:00PM +0300, Ilias Apalodimas wrote:
> > This RFC is trying to clean up the usage of the internal functions used
> > to manage the protocol and handle lifetimes.  Currently we arbitrarily
> > use either InstallProtocol, InstallMultipleProtocol and a combination of
> > efi_add_protocol, efi_create_handle, efi_delete_handle().  The latter
> > is the most problematic one since it blindly removes all protocols from
> > a handle and finally the handle itself.  This is prone to coding errors
> > Since someone might inadvertently delete a handle while other consumers
> > still use a protocol.
>
> I'm not sure about what specific issue you're trying to fix with this patch.
> Looking at patch#2, you simply replace efi_delete_handle() with
> uninstall_multiple_protocol_interfaces(). So the problem still stay there
> because it seems that we still have to care about where and when those
> functions should be called any way.

No that's handled automatically in
uninstall_multiple_protocol_interfaces().  Imagine 2 different
functions installing protocols on the same handle.  With the current
code if one calls efi_delete_handle() it will delete all the protocols
and the handle, while uninstall_multiple_protocol_interfaces() will
preserve the protocols it has to.  Arguably calling
efi_delete_handle() in that case is a coding error,  but in any case
we should provide users with an API that shields them against mistakes
like that.

>
> That said, I don't think your cleanup is meaningless; there is a difference
> between efi_delete_handle() and efi_uninstall_multiple_protocol_interfaces().
> The former calls efi_remove_protocol() internally, whereas the latter calls
> efi_uninstall_protocol(); That makes difference.
>
> In the description of UninstallProtocolInterface in UEFI spec,
> "The caller is responsible for ensuring that there are no references
> to a protocol interface that has been removed. In some cases, outstanding
> reference information is not available in the protocol, so the protocol,
> once added, cannot be removed."
> "EFI 1.10 Extension
>
> The extension to this service directly addresses the limitations described in
> the section above. There may be some drivers that are currently consuming
> the protocol interface that needs to be uninstalled, so it may be dangerous
> to just blindly remove a protocol interface from the system. Since the usage
> of protocol interfaces is now being tracked for components that use
> the EFI_BOOT_SERVICES.OpenProtocol() and EFI_BOOT_SERVICES.CloseProtocol()."
>
> So I think you can rationalize your clean-up more specifically.

Those are 2 different problems but I'll add the description for open
protocols as well.

>
> Here, I have a concern. According to UEFI spec above, I've got an impression
> that UninstalllProtocolInterface() should fails if someone still opens
> a protocol associated with a handle as UEFI subsystem is set to maintain such
> "open" information in handle database.
> There is some logic there regarding EFI_OPEN_PROTOCOL_xxx, but I'm not sure
> it works as expected under the current implementation.
> I think that this issue is to be addressed, or at least investigated.
>
> -Takahiro Akashi

Thanks
/Ilias

>
> > InstallProtocol is also ambiguous since the EFI spec only demands
> > InstallMultipleProtocol to test and guarantee a duplicate device path is
> > not inadvertently installed on two different handles.  So this patch
> > series is preparing the ground in order for InstallMultipleProtocol and
> > UnInstallMultipleProtocol to be used internally in U-Boot.
> >
> > There is an example on bootefi.c demonstrating how the cleanup would
> > eventually look like.  If we agree on the direction, I'll clean up the
> > remaining callsites with InstallMultipleProtocol.
> >
> > Size differences between old/new binary show that eventually we will
> > manage to reduce the overall code size by getting rid all the
> > unneeded  EFI_CALL invocations
> >
> > add/remove: 4/0 grow/shrink: 1/6 up/down: 1128/-892 (236)
> > Function                                     old     new   delta
> > __efi_install_multiple_protocol_interfaces       -     496    +496
> > __efi_uninstall_multiple_protocol_interfaces       -     412    +412
> > efi_uninstall_multiple_protocol_interfaces_ext       -     108    +108
> > efi_install_multiple_protocol_interfaces_ext       -     108    +108
> > efi_run_image                                288     292      +4
> > efi_initrd_register                          220     212      -8
> > efi_console_register                         344     336      -8
> > efi_disk_add_dev.part                        644     632     -12
> > efi_root_node_register                       256     240     -16
> > efi_uninstall_multiple_protocol_interfaces     472      84    -388
> > efi_install_multiple_protocol_interfaces     544      84    -460
> > Total: Before=547442, After=547678, chg +0.04%
> > add/remove: 0/0 grow/shrink: 0/0 up/down: 0/0 (0)
> > Data                                         old     new   delta
> > Total: Before=101061, After=101061, chg +0.00%
> > add/remove: 0/0 grow/shrink: 0/0 up/down: 0/0 (0)
> > RO Data                                      old     new   delta
> > Total: Before=42925, After=42925, chg +0.00%
> >
> > Ilias Apalodimas (2):
> >   efi_loader: define internal implementation of
> >     install/uninstallmultiple
> >   cmd: replace efi_create_handle/add_protocol with
> >     InstallMultipleProtocol
> >
> >  cmd/bootefi.c                    |  13 ++-
> >  include/efi.h                    |   2 +
> >  include/efi_loader.h             |   6 +-
> >  lib/efi_loader/efi_boottime.c    | 180 ++++++++++++++++++++++++-------
> >  lib/efi_loader/efi_capsule.c     |  15 +--
> >  lib/efi_loader/efi_console.c     |  14 +--
> >  lib/efi_loader/efi_disk.c        |  10 +-
> >  lib/efi_loader/efi_load_initrd.c |  15 ++-
> >  lib/efi_loader/efi_root_node.c   |  44 ++++----
> >  9 files changed, 203 insertions(+), 96 deletions(-)
> >
> > --
> > 2.34.1
> >


More information about the U-Boot mailing list