From: "Ard Biesheuvel" <ard.biesheuvel@arm.com>
To: devel@edk2.groups.io, lersek@redhat.com
Cc: Zhichao Gao <zhichao.gao@intel.com>, Ray Ni <ray.ni@intel.com>,
Jian J Wang <jian.j.wang@intel.com>,
Hao A Wu <hao.a.wu@intel.com>, Dandan Bi <dandan.bi@intel.com>
Subject: Re: [edk2-devel] [PATCH] MdeModulePkg/DeviceManagerUiLib: connect all before creating menu page
Date: Thu, 9 Apr 2020 11:37:19 +0200 [thread overview]
Message-ID: <f854e234-0f4c-deb9-0d46-33279b73d723@arm.com> (raw)
In-Reply-To: <1e1d4c9d-01ed-2b65-69ec-278f95309d25@redhat.com>
On 4/9/20 11:29 AM, Laszlo Ersek via groups.io wrote:
> On 04/08/20 19:28, Ard Biesheuvel wrote:
>> The device manager UI library creates a UiApp submenu that contains a
>> list of network devices in the system. The logic that creates this menu
>> assumes that all handles have been connected to their drivers, but this
>> is not guaranteed in the general case.
>>
>> So work around this by doing an explicit ConnectAll() before populating
>> the pages.
>>
>> Cc: Zhichao Gao <zhichao.gao@intel.com>
>> Cc: Ray Ni <ray.ni@intel.com>
>> Cc: Jian J Wang <jian.j.wang@intel.com>
>> Cc: Hao A Wu <hao.a.wu@intel.com>
>> Cc: Dandan Bi <dandan.bi@intel.com>
>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
>> ---
>> MdeModulePkg/Library/DeviceManagerUiLib/DeviceManager.c | 7 +++++++
>> MdeModulePkg/Library/DeviceManagerUiLib/DeviceManager.h | 1 +
>> MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf | 1 +
>> 3 files changed, 9 insertions(+)
>
> Can you describe one example that's (a) relevant to you and (b) affected
> by this issue?
>
Yes. The SynQuacer platform has a NIC driver that waits up to 5 seconds
for the link to come up after it resets the PHY, which never happens if
you boot without a network cable connected. But in the general case,
connecting all network drivers on a typical BootOrder based boot should
be be necessary.
Currently, ArmPkg's PlatformBootManagerLib does a
EfiBootManagerConnectAll () in its AfterConsole() callback, and so this
delay is always induced. I intend to 'fix' this platform (and this
library in general) to only do a EfiBootManagerConnectAllDefaultConsoles
() at this point, which is sufficient to interrupt the boot if
necessary, and otherwise, boot as fast as possible, without connecting
any devices that are not needed for this.
This works surprisingly well, with the exception of the 'Network Device
List' in the device manager UiApp menu, which no longer lists the
network interface, even though UiApp does a connect-all as it starts up.
As you guessed, the constructor ordering versus the connect-all call
results in the 'network device list' menu to be populated before any of
the non-connected handles are connected. This is obviously against the
intent of doing a connect-all and enumerating all devices, and so this
is a bug in UiApp.
> EfiBootManagerConnectAll() feels quite heavy-weight; I'd *vaguely*
> prefer adding it elsewhere, instead of a "UI lib"'s constructor. I don't
> have a particular suggestion however.
>
> I guess part of the issue must be that the EfiBootManagerConnectAll()
> calls in BootManagerMenuApp / UiApp are not reached, somehow. Maybe
> those are the calls that DeviceManagerUiLib takes for granted.
>
I agree that this approach is not the most elegant, but the way UiApp is
constructed makes it very hard to find a better way without some major
refactoring.
>> diff --git a/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManager.c b/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManager.c
>> index 0540e6fa8a44..3bc13d340775 100644
>> --- a/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManager.c
>> +++ b/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManager.c
>> @@ -892,6 +892,13 @@ DeviceManagerUiLibConstructor (
>> );
>> ASSERT (gDeviceManagerPrivate.HiiHandle != NULL);
>>
>> + //
>> + // The device manager form contains a page listing all the network
>> + // controllers in the system. This list can only be populated if all
>> + // handles have been connected, so do it here.
>> + //
>> + EfiBootManagerConnectAll ();
>> +
>> //
>> // Update boot manager page
>> //
>> diff --git a/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManager.h b/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManager.h
>> index 22fe12d2a5e8..c53c2a1a0e1a 100644
>> --- a/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManager.h
>> +++ b/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManager.h
>> @@ -23,6 +23,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>> #include <Library/BaseLib.h>
>> #include <Library/HiiLib.h>
>> #include <Library/DevicePathLib.h>
>> +#include <Library/UefiBootManagerLib.h>
>> #include <Library/UefiHiiServicesLib.h>
>>
>> //
>> diff --git a/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf b/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
>> index cb01b3b85180..d7f833d8b23a 100644
>> --- a/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
>> +++ b/MdeModulePkg/Library/DeviceManagerUiLib/DeviceManagerUiLib.inf
>> @@ -40,6 +40,7 @@ [LibraryClasses]
>> DebugLib
>> PrintLib
>> HiiLib
>> + UefiBootManagerLib
>> UefiHiiServicesLib
>>
>> [Guids]
>>
>
>
>
>
next prev parent reply other threads:[~2020-04-09 9:37 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-08 17:28 [PATCH] MdeModulePkg/DeviceManagerUiLib: connect all before creating menu page Ard Biesheuvel
2020-04-09 9:29 ` [edk2-devel] " Laszlo Ersek
2020-04-09 9:37 ` Ard Biesheuvel [this message]
2020-04-09 13:30 ` Laszlo Ersek
2020-04-12 7:55 ` Dandan Bi
2020-04-12 8:11 ` Hot Tian
2020-04-14 10:02 ` Laszlo Ersek
2020-04-12 8:21 ` Ard Biesheuvel
2020-04-19 8:06 ` Dandan Bi
2020-04-24 17:59 ` Ard Biesheuvel
[not found] ` <1608D342B47ED79B.10837@groups.io>
2020-04-30 7:52 ` Ard Biesheuvel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f854e234-0f4c-deb9-0d46-33279b73d723@arm.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox