[PATCH] efi_selftests: fix controllers repeated selftesting

Ilias Apalodimas ilias.apalodimas at linaro.org
Tue Jun 13 17:08:41 CEST 2023


Hi Heinrich,

On Tue, 13 Jun 2023 at 18:00, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
> On 6/13/23 15:23, Ilias Apalodimas wrote:
> > Running the controller selftest more than one times fails with
> >
> > => setenv efi_selftest 'controllers' && bootefi selftest
> > Testing EFI API implementation
> > Selected test: 'controllers'
> > Setting up 'controllers'
> > Setting up 'controllers' succeeded
> > Executing 'controllers'
> > Executing 'controllers' succeeded
> > Summary: 0 failures
> >
> > => bootefi selftest
> > Testing EFI API implementation
> > Selected test: 'controllers'
> > Setting up 'controllers'
> > lib/efi_selftest/efi_selftest_controllers.c(280):
> > ERROR: InstallProtocolInterface failed
> > lib/efi_selftest/efi_selftest.c(89):
> > ERROR: Setting up 'controllers' failed
> > Summary: 1 failures
> >
> > There are multiple reason for this.  We don't uninstall the binding
> > interface from the controller handle and we don't reset the handle
> > pointers either.  So let's uninstall all the protocols properly and
> > reset the handles to NULL on setup().
> >
> > While at it add a forgotten check when uninstalling protocols from the
> > handle_controller and make sure the number of child controllers is 0
> >
> > Signed-off-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> > ---
> >   lib/efi_selftest/efi_selftest_controllers.c | 14 +++++++++++++-
> >   1 file changed, 13 insertions(+), 1 deletion(-)
> >
> > diff --git a/lib/efi_selftest/efi_selftest_controllers.c b/lib/efi_selftest/efi_selftest_controllers.c
> > index d2bbd1c4f65b..07a17ed866a9 100644
> > --- a/lib/efi_selftest/efi_selftest_controllers.c
> > +++ b/lib/efi_selftest/efi_selftest_controllers.c
> > @@ -271,6 +271,8 @@ static int setup(const efi_handle_t img_handle,
> >       efi_status_t ret;
> >
> >       boottime = systable->boottime;
> > +     handle_controller =  NULL;
> > +     handle_driver = NULL;
>
> Other instances of the same problem could be in
>
> lib/efi_selftest/efi_selftest_open_protocol.c
> lib/efi_selftest/efi_selftest_loadimage.c
> lib/efi_selftest/efi_selftest_manageprotocols.c
>
> We should probably try for each test if it can be repeated.

I've fixed the manageprotocols in a subsequent patch.  The rest are
probably problematic as well, but I was planning to deal with them
after I am done with the protocol refactoring.

>
> >
> >       /* Create controller handle */
> >       ret = boottime->install_protocol_interface(
> > @@ -402,8 +404,18 @@ static int execute(void)
> >       /* Check number of child controllers */
> >       ret = count_child_controllers(handle_controller, &guid_controller,
> >                                     &count);
> > -     if (ret == EFI_SUCCESS)
> > +     if (ret == EFI_SUCCESS || count != 0)
> >               efi_st_error("Uninstall failed\n");
> > +
> > +     /* Uninstall binding protocol */
> > +     ret = boottime->uninstall_protocol_interface(handle_driver,
> > +                                                  &guid_driver_binding_protocol,
> > +                                                  &binding_interface);
> > +     if (ret != EFI_SUCCESS) {
> > +             efi_st_error("Failed to uninstall protocols\n");
> > +             return EFI_ST_FAILURE;
> > +     }
> > +
>
> Could this easily be moved to teardown()?

Yea, I don't think this will be a problem

Thanks
/Ilias
>
> Best regards
>
> Heinrich
>
> >       return EFI_ST_SUCCESS;
> >   }
> >
>


More information about the U-Boot mailing list