Re: [PATCH 4/4] conf: Optimize the iothreadid initialization

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

 



On Tue, Oct 13, 2015 at 13:54:54 -0400, John Ferlan wrote:
> On 10/13/2015 12:29 PM, Peter Krempa wrote:
> > On Tue, Oct 13, 2015 at 11:47:10 -0400, John Ferlan wrote:

...

> >> @@ -2341,15 +2343,49 @@ virDomainIOThreadIDDefArrayInit(virDomainDefPtr def)
> >>      if (def->iothreads == def->niothreadids)
> >>          return 0;
> > 
> > The code below seems too complex. I'd suggest something along the
> > following pseudo-code:
> > 
> >     assert(def->iothreads >= def->niothreads);
> > 
> >     virBitmapPtr *threads = virBitmapNew(def->iothreads);
> >     ssize_t nxt = 0;
> > 
> >     virBitmapSetAll(threads);
> > 
> >     /* mark which are already provided by the user */
> >     for (i = 0; i < def->niothreads; i++)
> >         virBitmapClearBit(threads, def->iothreadids[i]->id);
> > 
> >     /* resize array */
> >     VIR_REALLOC_N(def->iothreadids....);
> > 
> >     while ((nxt = virBitmapNextSetBit(bitmap, nxt)) >= 0) {

[1]

> >         /* add the stuff */
> >     }
> > 
> This would work if we required thread_id values to be <= def->iothreads,
> but we don't, yet...  I thought of using a bitmap, but it would no cover
> the following case :

Actually not necessarily, you only need to map the IDs in the range of
<0,def->iothreads> since the worst case scenario is that you'd be adding
all the iothreads in that range (if def->niothreadids is 0). Any
iothread with id greater than def->iothreads will be ignored in the
mapping process, but left in the array so the suggested loop [1] needs
to be slightly modified:

while ((nxt = virBitmapNextSetBit(bitmap, nxt)) >= 0 &&
       def->niothreadis < def->iothreads) {

> 
>    <iothreads>4</iothreads>
>    <iothreadids>
>      <iothread id='100'/>
>    <iothreadids>
> 
> 
> This would/should create thread ids 100, 1, 2, 3

The code above with the slight tweak will produce exactly the results
above.

> 
> We never placed a limit on the thread_id value other than it cannot be
> zero.  Although we do indicate the default algorithm is 1 to the number
> of iothreads.
> 
> Would a 'real world' user do something like this - perhaps not.  Much
> less make "<iothreads>1000000</iothreads>" (that'd be one long command
> line - say nothing of the resources required in order to really start it.
> 
> I'd be all for restricting iothread id values to be <= def->iothreads -
> that'd solve the unnecessarily complex algorithm.
> 
> My other thought was to restrict the number of iothreads to be the
> number of disk devices or even 2 * ndisks. It's possible to assign
> multiple disks to 1 iothread, but impossible to assign 1 disk to
> multiple threads.

IMO, none of the above is necessary.

Peter

Attachment: signature.asc
Description: Digital signature

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list

[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]