On 06.10.2015 19:39, Eric Snowberg wrote: > 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. > Unfortunately on some systems (AFAIR old sparcs) hard-locks if the same device is opened twice. We tried to detect when 2 devices are named differently but it's not possible to do reliably on IEEE1275. Our only solution was to ensure that only 1 disk is open at a time. Do you use some kind of RAID? Can you try keeping last_handle open in ofdisk.c rather than closing it? > 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; > >
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel