X-Git-Url: https://git.tld-linux.org/?p=packages%2Fgrub2.git;a=blobdiff_plain;f=efi-net-fix.patch;fp=efi-net-fix.patch;h=41872c001d2da17788408ef25884f1d264c5ee6b;hp=0000000000000000000000000000000000000000;hb=9d17de0887ee48f66be4e47be43f8fc6a4ea7799;hpb=f70448640b83ae5ebec0579e4b9ecee8c405bb22 diff --git a/efi-net-fix.patch b/efi-net-fix.patch new file mode 100644 index 0000000..41872c0 --- /dev/null +++ b/efi-net-fix.patch @@ -0,0 +1,59 @@ +From 886d93184b894a29b0bef1f2467230a20c7a33ce Mon Sep 17 00:00:00 2001 +From: Mark Salter +Date: Tue, 8 Apr 2014 10:58:11 -0400 +Subject: [PATCH] reopen SNP protocol for exclusive use by grub + +While working with pxeboot of grub on an ARM platform, I noticed +very poor network performance while grub was loading a kernel +and initramfs. The performance during the loading of grub itself +seemed reasonable. Digging into the issue, I found that the UEFI +firmware was periodically polling for network packets while grub +was downloading files. This was causing timeouts and retries in +the grub network stack. + +The solution I found was to reopen the SNP protocol for exclusive +use. This forces UEFI to shutdown its use of SNP so that grub is +not competing for incoming packets. + +Signed-off-by: Mark Salter +--- + grub-core/net/drivers/efi/efinet.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c +index 2b344d6..a6e4c79 100644 +--- a/grub-core/net/drivers/efi/efinet.c ++++ b/grub-core/net/drivers/efi/efinet.c +@@ -223,6 +223,7 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device, + { + struct grub_net_card *card; + grub_efi_device_path_t *dp; ++ grub_efi_simple_network_t *net; + + dp = grub_efi_get_device_path (hnd); + if (! dp) +@@ -250,6 +251,21 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device, + &pxe_mode->dhcp_ack, + sizeof (pxe_mode->dhcp_ack), + 1, device, path); ++ net = grub_efi_open_protocol (card->efi_handle, &net_io_guid, ++ GRUB_EFI_OPEN_PROTOCOL_BY_EXCLUSIVE); ++ if (net) { ++ if (net->mode->state == GRUB_EFI_NETWORK_STOPPED ++ && efi_call_1 (net->start, net) != GRUB_EFI_SUCCESS) ++ continue; ++ ++ if (net->mode->state == GRUB_EFI_NETWORK_STOPPED) ++ continue; ++ ++ if (net->mode->state == GRUB_EFI_NETWORK_STARTED ++ && efi_call_3 (net->initialize, net, 0, 0) != GRUB_EFI_SUCCESS) ++ continue; ++ card->efi_net = net; ++ } + return; + } + } +-- +1.8.5.3 +