grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] sparc64: boot performance improvements


From: Eric Snowberg
Subject: [PATCH] sparc64: boot performance improvements
Date: Tue, 6 Oct 2015 13:39:44 -0400

Keep of devices open.  This can save 6 - 7 seconds per open call and
can decrease boot times from over 10 minutes to 29 seconds on
larger SPARC systems.  The open/close calls with some vendors'
SAS controllers cause the entire card to be reinitialized after
each close.

Signed-off-by: Eric Snowberg <address@hidden>
---
 grub-core/kern/ieee1275/ieee1275.c |   39 ++++++++++++++++++++++++++++++++++++
 1 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/grub-core/kern/ieee1275/ieee1275.c 
b/grub-core/kern/ieee1275/ieee1275.c
index 9821702..30f973b 100644
--- a/grub-core/kern/ieee1275/ieee1275.c
+++ b/grub-core/kern/ieee1275/ieee1275.c
@@ -19,11 +19,24 @@
 
 #include <grub/ieee1275/ieee1275.h>
 #include <grub/types.h>
+#include <grub/misc.h>
+#include <grub/list.h>
+#include <grub/mm.h>
 
 #define IEEE1275_PHANDLE_INVALID  ((grub_ieee1275_cell_t) -1)
 #define IEEE1275_IHANDLE_INVALID  ((grub_ieee1275_cell_t) 0)
 #define IEEE1275_CELL_INVALID     ((grub_ieee1275_cell_t) -1)
 
+struct grub_of_opened_device
+{
+  struct grub_of_opened_device *next;
+  struct grub_of_opened_device **prev;
+  grub_ieee1275_ihandle_t ihandle;
+  char *path;
+};
+
+static struct grub_of_opened_device *grub_of_opened_devices;
+
 
 
 int
@@ -452,6 +465,18 @@ grub_ieee1275_open (const char *path, 
grub_ieee1275_ihandle_t *result)
   }
   args;
 
+  struct grub_of_opened_device *dev;
+
+  FOR_LIST_ELEMENTS(dev, grub_of_opened_devices)
+    if (grub_strcmp(dev->path, path) == 0)
+      break;
+
+  if (dev)
+  {
+    *result = dev->ihandle;
+    return 0;
+  }
+
   INIT_IEEE1275_COMMON (&args.common, "open", 1, 1);
   args.path = (grub_ieee1275_cell_t) path;
 
@@ -460,6 +485,11 @@ grub_ieee1275_open (const char *path, 
grub_ieee1275_ihandle_t *result)
   *result = args.result;
   if (args.result == IEEE1275_IHANDLE_INVALID)
     return -1;
+
+  dev = grub_zalloc(sizeof(struct grub_of_opened_device));
+  dev->path = grub_strdup(path);
+  dev->ihandle = args.result;
+  grub_list_push(GRUB_AS_LIST_P (&grub_of_opened_devices), GRUB_AS_LIST (dev));
   return 0;
 }
 
@@ -473,6 +503,15 @@ grub_ieee1275_close (grub_ieee1275_ihandle_t ihandle)
   }
   args;
 
+  struct grub_of_opened_device *dev;
+
+  FOR_LIST_ELEMENTS(dev, grub_of_opened_devices)
+    if (dev->ihandle == ihandle)
+      break;
+
+  if (dev)
+    return 0;
+
   INIT_IEEE1275_COMMON (&args.common, "close", 1, 0);
   args.ihandle = ihandle;
 
-- 
1.7.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]