On Fri, 26 Apr 2013 11:36:11 -0500
Anthony Liguori <anth...@codemonkey.ws> wrote:

> Dominik Dingel <din...@linux.vnet.ibm.com> writes:
> 
> > Currently only devices with a positive boot index will be pushed in the
> > fw_boot_order queue, so if no boot index at all will be specified,
> > the queue ends up empty.
> >
> > Instead we push exactly as docs/bootindex.txt says the devices with
> > the lowest possible boot priority at the tail of the queue,
> > because we give them the highest available boot index.
> >
> > Signed-off-by: Dominik Dingel <din...@linux.vnet.ibm.com>
> 
> Wouldn't this break the ability to say: "don't every try to boot from
> this device?"
> 
> As an example, some people want to force PXE boot to not be tried on
> certain networks.
> 
> Regards,
> 
> Anthony Liguori

That is correct, hmm. The thing is, if we don't submit a bootindex, we will 
assign -1 in virtio-blk and virtio-net. This would forbid that the device would 
be booted from. 
Where docs/bootindex.txt says: if a device got no bootindex, it gets the lowest 
possibly priority... 

One way to fix this, would be to change the behaviour for virtio-blk and 
virtio-net, if there is no boot value assigned to, give it the possible highest 
number. 

Would be this okay for you Anthony?

Dominik
 
> >
> > diff --git a/vl.c b/vl.c
> > index 6caa5f4..84d7031 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -248,7 +248,7 @@ struct FWBootEntry {
> >      char *suffix;
> >  };
> >  
> > -static QTAILQ_HEAD(, FWBootEntry) fw_boot_order =
> > +static QTAILQ_HEAD(FWBootOrder, FWBootEntry) fw_boot_order =
> >      QTAILQ_HEAD_INITIALIZER(fw_boot_order);
> >  
> >  int nb_numa_nodes;
> > @@ -1213,10 +1213,21 @@ void add_boot_device_path(int32_t bootindex, 
> > DeviceState *dev,
> >      FWBootEntry *node, *i;
> >  
> >      if (bootindex < 0) {
> > -        return;
> > +        bootindex = INT32_MAX;
> > +        if (!QTAILQ_EMPTY(&fw_boot_order) &&
> > +           (QTAILQ_LAST(&fw_boot_order, FWBootOrder)->bootindex == 
> > INT32_MAX)) {
> > +            /* there is a device at the end of the queue, so we need to 
> > walk
> > +               the queue reverse to get the next free bootindex */
> > +            QTAILQ_FOREACH_REVERSE(i, &fw_boot_order, FWBootOrder, link) {
> > +                if (i->bootindex != bootindex) {
> > +                    break;
> > +                }
> > +                bootindex--;
> > +            }
> > +        }
> >      }
> >  
> > -    assert(dev != NULL || suffix != NULL);
> > +    assert(dev != NULL || suffix != NULL || bootindex >=  0);
> >  
> >      node = g_malloc0(sizeof(FWBootEntry));
> >      node->bootindex = bootindex;
> > -- 
> > 1.7.9.5
> 


Reply via email to