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 <eric.snowb...@oracle.com> --- 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 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel