[libvirt] [PATCH] docs: Make hvsupport.pl pick up the host device drivers

Daniel P. Berrange berrange at redhat.com
Mon Jun 6 09:56:08 UTC 2011


On Sun, Jun 05, 2011 at 10:10:08AM +0200, Matthias Bolte wrote:
> Annotate the ESX device driver dummy.
> 
> Refactor the udev and hal device driver strcuts to match the
> common annotation pattern.
> ---
> 
> This is post-0.9.2.
> 
>  docs/hvsupport.pl                    |   22 +++++++++++++----
>  src/esx/esx_device_monitor.c         |   15 ++---------
>  src/node_device/node_device_driver.c |   45 +++++++++++++---------------------
>  src/node_device/node_device_driver.h |   14 +++++++++-
>  src/node_device/node_device_hal.c    |   22 +++++++++++-----
>  src/node_device/node_device_udev.c   |   22 +++++++++++-----
>  6 files changed, 79 insertions(+), 61 deletions(-)
> 
> diff --git a/docs/hvsupport.pl b/docs/hvsupport.pl
> index 8a0fa7a..b0d1f0f 100755
> --- a/docs/hvsupport.pl
> +++ b/docs/hvsupport.pl
> @@ -27,7 +27,7 @@ my %groupheaders = (
>  my @srcs;
>  find({
>      wanted => sub {
> -	if (m!$srcdir/.*/\w+_(driver|tmpl)\.c$!) {
> +	if (m!$srcdir/.*/\w+_(driver|tmpl|monitor|hal|udev)\.c$!) {
>  	    push @srcs, $_ if $_ !~ /vbox_driver\.c/;
>  	}
>      }, no_chdir => 1}, $srcdir);
> @@ -142,7 +142,7 @@ open FILE, "<$drivertable"
>  my %groups;
>  my $ingrp;
>  while (defined($line = <FILE>)) {
> -    if ($line =~ /struct _(vir\w*Driver)/) {
> +    if ($line =~ /struct _(vir\w*(?:Driver|Monitor))/) {
>  	my $grp = $1;
>  	if ($grp ne "virStateDriver" &&
>  	    $grp ne "virStreamDriver") {
> @@ -150,7 +150,7 @@ while (defined($line = <FILE>)) {
>  	    $groups{$ingrp} = { apis => {}, drivers => {} };
>  	}
>      } elsif ($ingrp) {
> -	if ($line =~ /^\s*virDrv(\w+)\s+(\w+);\s*$/) {
> +	if ($line =~ /^\s*vir(?:Drv|DevMon)(\w+)\s+(\w+);\s*$/) {
>  	    my $field = $2;
>  	    my $name = $1;
>  
> @@ -159,6 +159,8 @@ while (defined($line = <FILE>)) {
>  		$api = "vir$name";
>  	    } elsif (exists $apis{"virConnect$name"}) {
>  		$api = "virConnect$name";
> +	    } elsif (exists $apis{"virNode$name"}) {
> +		$api = "virNode$name";
>  	    } else {
>  		die "driver $name does not have a public API";
>  	    }
> @@ -188,7 +190,17 @@ foreach my $src (@srcs) {
>  		    $line =~ /^\s*(?:static\s+)?$grp\s+NAME\(\w+\)\s*=\s*{/) {
>  		    $ingrp = $grp;
>  		    $impl = $src;
> -		    $impl =~ s,.*/(\w+?)_((\w+)_)?(\w+)\.c,$1,;
> +
> +		    if ($impl =~ m,.*/node_device_(\w+)\.c,) {
> +			$impl = $1;
> +		    } else {
> +			$impl =~ s,.*/(\w+?)_((\w+)_)?(\w+)\.c,$1,;
> +		    }
> +
> +		    if ($groups{$ingrp}->{drivers}->{$impl}) {
> +			die "Group $ingrp already contains $impl";
> +		    }
> +
>  		    $groups{$ingrp}->{drivers}->{$impl} = {};
>  		}
>  	    }
> @@ -206,7 +218,7 @@ foreach my $src (@srcs) {
>  		die "Driver method for $api is NULL in $src" if $meth eq "NULL";
>  
>  		if (!exists($groups{$ingrp}->{apis}->{$api})) {
> -		    die "Found unexpected driver $api in $ingrp\n";
> +		    die "Found unexpected method $api in $ingrp\n";
>  		}
>  
>  		$groups{$ingrp}->{drivers}->{$impl}->{$api} = $vers;
> diff --git a/src/esx/esx_device_monitor.c b/src/esx/esx_device_monitor.c
> index 3fa63d5..4bc8e7f 100644
> --- a/src/esx/esx_device_monitor.c
> +++ b/src/esx/esx_device_monitor.c
> @@ -66,18 +66,9 @@ esxDeviceClose(virConnectPtr conn)
>  
>  
>  static virDeviceMonitor esxDeviceMonitor = {
> -    "ESX",                                 /* name */
> -    esxDeviceOpen,                         /* open */
> -    esxDeviceClose,                        /* close */
> -    NULL,                                  /* numOfDevices */
> -    NULL,                                  /* listDevices */
> -    NULL,                                  /* deviceLookupByName */
> -    NULL,                                  /* deviceGetXMLDesc */
> -    NULL,                                  /* deviceGetParent */
> -    NULL,                                  /* deviceNumOfCaps */
> -    NULL,                                  /* deviceListCaps */
> -    NULL,                                  /* deviceCreateXML */
> -    NULL,                                  /* deviceDestroy */
> +    .name = "ESX",
> +    .open = esxDeviceOpen, /* 0.7.6 */
> +    .close = esxDeviceClose, /* 0.7.6 */
>  };
>  
>  
> diff --git a/src/node_device/node_device_driver.c b/src/node_device/node_device_driver.c
> index 8ec3e44..842f903 100644
> --- a/src/node_device/node_device_driver.c
> +++ b/src/node_device/node_device_driver.c
> @@ -122,9 +122,10 @@ void nodeDeviceUnlock(virDeviceMonitorStatePtr driver)
>      virMutexUnlock(&driver->lock);
>  }
>  
> -static int nodeNumOfDevices(virConnectPtr conn,
> -                            const char *cap,
> -                            unsigned int flags ATTRIBUTE_UNUSED)
> +int
> +nodeNumOfDevices(virConnectPtr conn,
> +                 const char *cap,
> +                 unsigned int flags ATTRIBUTE_UNUSED)
>  {
>      virDeviceMonitorStatePtr driver = conn->devMonPrivateData;
>      int ndevs = 0;
> @@ -143,7 +144,7 @@ static int nodeNumOfDevices(virConnectPtr conn,
>      return ndevs;
>  }
>  
> -static int
> +int
>  nodeListDevices(virConnectPtr conn,
>                  const char *cap,
>                  char **const names, int maxnames,
> @@ -179,8 +180,8 @@ nodeListDevices(virConnectPtr conn,
>  }
>  
>  
> -static virNodeDevicePtr nodeDeviceLookupByName(virConnectPtr conn,
> -                                               const char *name)
> +virNodeDevicePtr
> +nodeDeviceLookupByName(virConnectPtr conn, const char *name)
>  {
>      virDeviceMonitorStatePtr driver = conn->devMonPrivateData;
>      virNodeDeviceObjPtr obj;
> @@ -251,8 +252,9 @@ out:
>  }
>  
>  
> -static char *nodeDeviceGetXMLDesc(virNodeDevicePtr dev,
> -                                  unsigned int flags ATTRIBUTE_UNUSED)
> +char *
> +nodeDeviceGetXMLDesc(virNodeDevicePtr dev,
> +                     unsigned int flags ATTRIBUTE_UNUSED)
>  {
>      virDeviceMonitorStatePtr driver = dev->conn->devMonPrivateData;
>      virNodeDeviceObjPtr obj;
> @@ -281,7 +283,8 @@ cleanup:
>  }
>  
>  
> -static char *nodeDeviceGetParent(virNodeDevicePtr dev)
> +char *
> +nodeDeviceGetParent(virNodeDevicePtr dev)
>  {
>      virDeviceMonitorStatePtr driver = dev->conn->devMonPrivateData;
>      virNodeDeviceObjPtr obj;
> @@ -314,7 +317,8 @@ cleanup:
>  }
>  
>  
> -static int nodeDeviceNumOfCaps(virNodeDevicePtr dev)
> +int
> +nodeDeviceNumOfCaps(virNodeDevicePtr dev)
>  {
>      virDeviceMonitorStatePtr driver = dev->conn->devMonPrivateData;
>      virNodeDeviceObjPtr obj;
> @@ -344,7 +348,7 @@ cleanup:
>  }
>  
>  
> -static int
> +int
>  nodeDeviceListCaps(virNodeDevicePtr dev, char **const names, int maxnames)
>  {
>      virDeviceMonitorStatePtr driver = dev->conn->devMonPrivateData;
> @@ -538,7 +542,7 @@ find_new_device(virConnectPtr conn, const char *wwnn, const char *wwpn)
>      return dev;
>  }
>  
> -static virNodeDevicePtr
> +virNodeDevicePtr
>  nodeDeviceCreateXML(virConnectPtr conn,
>                      const char *xmlDesc,
>                      unsigned int flags ATTRIBUTE_UNUSED)
> @@ -591,7 +595,7 @@ cleanup:
>  }
>  
>  
> -static int
> +int
>  nodeDeviceDestroy(virNodeDevicePtr dev)
>  {
>      int ret = -1;
> @@ -651,21 +655,6 @@ out:
>      return ret;
>  }
>  
> -
> -void registerCommonNodeFuncs(virDeviceMonitorPtr driver)
> -{
> -    driver->numOfDevices = nodeNumOfDevices;
> -    driver->listDevices = nodeListDevices;
> -    driver->deviceLookupByName = nodeDeviceLookupByName;
> -    driver->deviceGetXMLDesc = nodeDeviceGetXMLDesc;
> -    driver->deviceGetParent = nodeDeviceGetParent;
> -    driver->deviceNumOfCaps = nodeDeviceNumOfCaps;
> -    driver->deviceListCaps = nodeDeviceListCaps;
> -    driver->deviceCreateXML = nodeDeviceCreateXML;
> -    driver->deviceDestroy = nodeDeviceDestroy;
> -}
> -
> -
>  int nodedevRegister(void) {
>  #if defined(HAVE_HAL) && defined(HAVE_UDEV)
>      /* Register only one of these two - they conflict */
> diff --git a/src/node_device/node_device_driver.h b/src/node_device/node_device_driver.h
> index e583c2b..08779b1 100644
> --- a/src/node_device/node_device_driver.h
> +++ b/src/node_device/node_device_driver.h
> @@ -53,8 +53,6 @@ int udevNodeRegister(void);
>  void nodeDeviceLock(virDeviceMonitorStatePtr driver);
>  void nodeDeviceUnlock(virDeviceMonitorStatePtr driver);
>  
> -void registerCommonNodeFuncs(virDeviceMonitorPtr mon);
> -
>  int nodedevRegister(void);
>  
>  # ifdef __linux__
> @@ -86,4 +84,16 @@ int read_wwn_linux(int host, const char *file, char **wwn);
>  
>  # endif /* __linux__ */
>  
> +int nodeNumOfDevices(virConnectPtr conn, const char *cap, unsigned int flags);
> +int nodeListDevices(virConnectPtr conn, const char *cap, char **const names,
> +                    int maxnames, unsigned int flags);
> +virNodeDevicePtr nodeDeviceLookupByName(virConnectPtr conn, const char *name);
> +char *nodeDeviceGetXMLDesc(virNodeDevicePtr dev, unsigned int flags);
> +char *nodeDeviceGetParent(virNodeDevicePtr dev);
> +int nodeDeviceNumOfCaps(virNodeDevicePtr dev);
> +int nodeDeviceListCaps(virNodeDevicePtr dev, char **const names, int maxnames);
> +virNodeDevicePtr nodeDeviceCreateXML(virConnectPtr conn,
> +                                     const char *xmlDesc, unsigned int flags);
> +int nodeDeviceDestroy(virNodeDevicePtr dev);
> +
>  #endif /* __VIR_NODE_DEVICE_H__ */
> diff --git a/src/node_device/node_device_hal.c b/src/node_device/node_device_hal.c
> index 8df2875..a90e777 100644
> --- a/src/node_device/node_device_hal.c
> +++ b/src/node_device/node_device_hal.c
> @@ -881,22 +881,30 @@ static int halNodeDrvClose(virConnectPtr conn ATTRIBUTE_UNUSED)
>  
>  static virDeviceMonitor halDeviceMonitor = {
>      .name = "halDeviceMonitor",
> -    .open = halNodeDrvOpen,
> -    .close = halNodeDrvClose,
> +    .open = halNodeDrvOpen, /* 0.5.0 */
> +    .close = halNodeDrvClose, /* 0.5.0 */
> +    .numOfDevices = nodeNumOfDevices, /* 0.5.0 */
> +    .listDevices = nodeListDevices, /* 0.5.0 */
> +    .deviceLookupByName = nodeDeviceLookupByName, /* 0.5.0 */
> +    .deviceGetXMLDesc = nodeDeviceGetXMLDesc, /* 0.5.0 */
> +    .deviceGetParent = nodeDeviceGetParent, /* 0.5.0 */
> +    .deviceNumOfCaps = nodeDeviceNumOfCaps, /* 0.5.0 */
> +    .deviceListCaps = nodeDeviceListCaps, /* 0.5.0 */
> +    .deviceCreateXML = nodeDeviceCreateXML, /* 0.6.5 */
> +    .deviceDestroy = nodeDeviceDestroy, /* 0.6.5 */
>  };
>  
>  
>  static virStateDriver halStateDriver = {
>      .name = "HAL",
> -    .initialize = halDeviceMonitorStartup,
> -    .cleanup = halDeviceMonitorShutdown,
> -    .reload = halDeviceMonitorReload,
> -    .active = halDeviceMonitorActive,
> +    .initialize = halDeviceMonitorStartup, /* 0.5.0 */
> +    .cleanup = halDeviceMonitorShutdown, /* 0.5.0 */
> +    .reload = halDeviceMonitorReload, /* 0.5.0 */
> +    .active = halDeviceMonitorActive, /* 0.5.0 */
>  };
>  
>  int halNodeRegister(void)
>  {
> -    registerCommonNodeFuncs(&halDeviceMonitor);
>      if (virRegisterDeviceMonitor(&halDeviceMonitor) < 0)
>          return -1;
>      return virRegisterStateDriver(&halStateDriver);
> diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c
> index 29e4bac..8b9694e 100644
> --- a/src/node_device/node_device_udev.c
> +++ b/src/node_device/node_device_udev.c
> @@ -1741,23 +1741,31 @@ static int udevNodeDrvClose(virConnectPtr conn)
>  
>  static virDeviceMonitor udevDeviceMonitor = {
>      .name = "udevDeviceMonitor",
> -    .open = udevNodeDrvOpen,
> -    .close = udevNodeDrvClose,
> +    .open = udevNodeDrvOpen, /* 0.7.3 */
> +    .close = udevNodeDrvClose, /* 0.7.3 */
> +    .numOfDevices = nodeNumOfDevices, /* 0.7.3 */
> +    .listDevices = nodeListDevices, /* 0.7.3 */
> +    .deviceLookupByName = nodeDeviceLookupByName, /* 0.7.3 */
> +    .deviceGetXMLDesc = nodeDeviceGetXMLDesc, /* 0.7.3 */
> +    .deviceGetParent = nodeDeviceGetParent, /* 0.7.3 */
> +    .deviceNumOfCaps = nodeDeviceNumOfCaps, /* 0.7.3 */
> +    .deviceListCaps = nodeDeviceListCaps, /* 0.7.3 */
> +    .deviceCreateXML = nodeDeviceCreateXML, /* 0.7.3 */
> +    .deviceDestroy = nodeDeviceDestroy, /* 0.7.3 */
>  };
>  
>  static virStateDriver udevStateDriver = {
>      .name = "udev",
> -    .initialize = udevDeviceMonitorStartup,
> -    .cleanup = udevDeviceMonitorShutdown,
> -    .reload = udevDeviceMonitorReload,
> -    .active = udevDeviceMonitorActive,
> +    .initialize = udevDeviceMonitorStartup, /* 0.7.3 */
> +    .cleanup = udevDeviceMonitorShutdown, /* 0.7.3 */
> +    .reload = udevDeviceMonitorReload, /* 0.7.3 */
> +    .active = udevDeviceMonitorActive, /* 0.7.3 */
>  };
>  
>  int udevNodeRegister(void)
>  {
>      VIR_DEBUG("Registering udev node device backend");
>  
> -    registerCommonNodeFuncs(&udevDeviceMonitor);
>      if (virRegisterDeviceMonitor(&udevDeviceMonitor) < 0) {
>          return -1;
>      }

ACK, I completely missed the node device APIs when doing the conversion
because of this wierd driver structure.

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list