You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.7 KiB
45 lines
1.7 KiB
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
|
From: Josef Bacik <jbacik@fb.com> |
|
Date: Mon, 31 Aug 2015 13:34:35 -0400 |
|
Subject: [PATCH] efinet: retransmit if our device is busy |
|
|
|
When I fixed the txbuf handling I ripped out the retransmission code since it |
|
was flooding our network when we had the buggy behavior. Turns out this was too |
|
heavy handed as we can still have transient tx timeouts. So instead make sure |
|
we retry our transmission once per timeout. This way we can deal with transient |
|
transmission problems without flooding the box. This fixes an issue we were |
|
seeing in production. Thanks, |
|
|
|
Signed-off-by: Josef Bacik <jbacik@fb.com> |
|
--- |
|
grub-core/net/drivers/efi/efinet.c | 10 ++++++++++ |
|
1 file changed, 10 insertions(+) |
|
|
|
diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c |
|
index ea0e0ca360e..c3a128cd1dc 100644 |
|
--- a/grub-core/net/drivers/efi/efinet.c |
|
+++ b/grub-core/net/drivers/efi/efinet.c |
|
@@ -38,6 +38,7 @@ send_card_buffer (struct grub_net_card *dev, |
|
grub_efi_simple_network_t *net = dev->efi_net; |
|
grub_uint64_t limit_time = grub_get_time_ms () + 4000; |
|
void *txbuf; |
|
+ int retry = 0; |
|
|
|
if (dev->txbusy) |
|
while (1) |
|
@@ -60,6 +61,15 @@ send_card_buffer (struct grub_net_card *dev, |
|
dev->txbusy = 0; |
|
break; |
|
} |
|
+ if (!retry) |
|
+ { |
|
+ st = efi_call_7 (net->transmit, net, 0, dev->last_pkt_size, |
|
+ dev->txbuf, NULL, NULL, NULL); |
|
+ if (st != GRUB_EFI_SUCCESS) |
|
+ return grub_error (GRUB_ERR_IO, |
|
+ N_("couldn't send network packet")); |
|
+ retry = 1; |
|
+ } |
|
if (limit_time < grub_get_time_ms ()) |
|
return grub_error (GRUB_ERR_TIMEOUT, |
|
N_("couldn't send network packet"));
|
|
|