[libvirt] [PATCH] conf: nodedev: Update capabilities from within virNodeDeviceObjHasCap

John Ferlan jferlan at redhat.com
Wed Mar 14 19:28:36 UTC 2018



On 03/06/2018 10:32 AM, Erik Skultety wrote:
> Commit d18feadc0c put this into virNodeDeviceMatch, but this should have
> rather been part of virNodeDeviceObjHasCap from the beginning, since
> virNodeDeviceObjHasCap is the last helper to be called (in the calltree)
> whereas virNodeDeviceMatch is called from a single place only -
> virNodeDeviceObjListExportCallback.
> 
> Signed-off-by: Erik Skultety <eskultet at redhat.com>
> ---
>  src/conf/virnodedeviceobj.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c
> index ad0f27ee4..0417664ad 100644
> --- a/src/conf/virnodedeviceobj.c
> +++ b/src/conf/virnodedeviceobj.c
> @@ -644,6 +644,10 @@ virNodeDeviceObjHasCap(const virNodeDeviceObj *obj,
>  {
>      virNodeDevCapsDefPtr cap = NULL;
>  
> +    /* Refresh the capabilities first, e.g. due to a driver change */
> +    if (virNodeDeviceUpdateCaps(obj->def) < 0)
> +        return false;
> +

While I understand why you put it here - in order to be somewhere common
for nodeDeviceCreateXML, nodeNumOfDevices, nodeListDevices, and
nodeConnectListAllNodeDevices.

However, I think this'll impact "performance" of virNodeDeviceMatch as
virNodeDeviceUpdateCaps would be called 16 times due to the logic of "if
!(MATCH() || MATCH() || MATCH() ...)))"

Of course the alternative is calling virNodeDeviceUpdateCaps from
nodeDeviceCreateXML, nodeNumOfDevices, nodeListDevices, and
nodeConnectListAllNodeDevices.

(or am I reading the !(a || b || c || ... ) logic wrong?

John

>      for (cap = obj->def->caps; cap; cap = cap->next) {
>          if (type == cap->data.type)
>              return true;
> @@ -811,10 +815,6 @@ static bool
>  virNodeDeviceMatch(virNodeDeviceObjPtr obj,
>                     unsigned int flags)
>  {
> -    /* Refresh the capabilities first, e.g. due to a driver change */
> -    if (virNodeDeviceUpdateCaps(obj->def) < 0)
> -        return false;
> -
>      /* filter by cap type */
>      if (flags & VIR_CONNECT_LIST_NODE_DEVICES_FILTERS_CAP) {
>          if (!(MATCH(SYSTEM)        ||
> 




More information about the libvir-list mailing list