]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Limit idle polling frequency
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 6 Jul 2011 16:21:07 +0000 (18:21 +0200)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Wed, 6 Jul 2011 16:21:07 +0000 (18:21 +0200)
grub-core/net/drivers/ieee1275/ofnet.c
grub-core/net/net.c
include/grub/net.h

index cc29d09874ad483da07b9ea8e2c3c9a1739ce857..20d45ee3db56dc89b4629a68e2216e966d345bed 100644 (file)
@@ -253,6 +253,7 @@ grub_ofnet_findcards (void)
        card->flags = 0;
        shortname = find_alias (alias->path);
        card->name = grub_xasprintf ("ofnet_%s", shortname ? : alias->path);
+       card->idle_poll_delay_ms = 1;
        grub_free (shortname);
 
        card->driver = &ofdriver;
index bc16fbde5173fb0b02b3606839eba608e441c764..641aebd64418f63d267e311ff9130a1ab62b4999 100644 (file)
@@ -768,6 +768,7 @@ receive_packets (struct grub_net_card *card)
       if (!nb)
        {
          grub_print_error ();
+         card->last_poll = grub_get_time_ms ();
          return;
        }
 
@@ -775,6 +776,7 @@ receive_packets (struct grub_net_card *card)
       if (actual < 0)
        {
          grub_netbuff_free (nb);
+         card->last_poll = grub_get_time_ms ();
          break;
        }
       grub_net_recv_ethernet_packet (nb, card);
@@ -800,7 +802,13 @@ grub_net_poll_cards_idle_real (void)
 {
   struct grub_net_card *card;
   FOR_NET_CARDS (card)
-    receive_packets (card);
+  {
+    grub_uint64_t ctime = grub_get_time_ms ();
+
+    if (ctime < card->last_poll
+       || ctime >= card->last_poll + card->idle_poll_delay_ms)
+      receive_packets (card);
+  }
 }
 
 /*  Read from the packets list*/
index 92e637d89ffcaca19f9346a854e917ab42337ac2..45d08f3f566e6397b6ec2ea7e769bf33bde0eb37 100644 (file)
@@ -95,6 +95,8 @@ struct grub_net_card
   grub_net_card_flags_t flags;
   int num_ifaces;
   int opened;
+  unsigned idle_poll_delay_ms;
+  grub_uint64_t last_poll;
   union
   {
 #ifdef GRUB_MACHINE_EFI