[libvirt] [PATCH 5/5] Reuse the socket in virNetDevGetFeatures
Peter Krempa
pkrempa at redhat.com
Tue Jun 7 08:32:28 UTC 2016
On Mon, Jun 06, 2016 at 09:39:28 +0200, Ján Tomko wrote:
> This speeds up node_device_udev driver startup 11x.
> ---
> src/util/virnetdev.c | 69 +++++++++++++++++++++++++++++-----------------------
> 1 file changed, 38 insertions(+), 31 deletions(-)
>
> diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
> index 52f02d3..7863e8a 100644
> --- a/src/util/virnetdev.c
> +++ b/src/util/virnetdev.c
> @@ -3206,20 +3206,11 @@ virNetDevRDMAFeature(const char *ifname,
> * Returns 0 on success, -1 on failure.
> */
> static int
> -virNetDevSendEthtoolIoctl(const char *ifname, void *cmd)
> +virNetDevSendEthtoolIoctl(int fd, struct ifreq *ifr)
You changed arguments but didn't fix the comment that documents them.
> {
> int ret = -1;
> - int fd = -1;
> - struct ifreq ifr;
> -
> - /* Ultimately uses AF_PACKET for socket which requires privileged
> - * daemon support.
> - */
> - if ((fd = virNetDevSetupControl(ifname, &ifr)) < 0)
> - return ret;
>
> - ifr.ifr_data = cmd;
> - ret = ioctl(fd, SIOCETHTOOL, &ifr);
> + ret = ioctl(fd, SIOCETHTOOL, ifr);
> if (ret != 0) {
> switch (errno) {
> case EINVAL: /* kernel doesn't support SIOCETHTOOL */
> @@ -3230,12 +3221,10 @@ virNetDevSendEthtoolIoctl(const char *ifname, void *cmd)
> break;
> default:
> virReportSystemError(errno, "%s", _("ethtool ioctl error"));
> - goto cleanup;
> + break;
These error reports don't make much sense now, but I guess we can keep
them for debugging purposes.
> }
> }
>
> - cleanup:
> - VIR_FORCE_CLOSE(fd);
> return ret;
> }
>
> @@ -3255,10 +3244,10 @@ struct ethtool_to_virnetdev_feature {
> * Returns 0 if not found, 1 on success, and -1 on failure.
Again. Argument change is not documented.
> */
> static bool
> -virNetDevFeatureAvailable(const char *ifname, struct ethtool_value *cmd)
> +virNetDevFeatureAvailable(int fd, struct ifreq *ifr, struct ethtool_value *cmd)
> {
> - cmd = (void*)cmd;
> - if (virNetDevSendEthtoolIoctl(ifname, cmd) == 0 &&
> + ifr->ifr_data = (void*)cmd;
> + if (virNetDevSendEthtoolIoctl(fd, ifr) == 0 &&
> cmd->data > 0)
> return true;
> return false;
> @@ -3332,10 +3322,12 @@ virNetDevGetEthtoolFeatures(virBitmapPtr bitmap,
> * Returns 0 if not found, 1 on success, and -1 on failure.
And here too ...
> */
> static bool
> -virNetDevGFeatureAvailable(const char *ifname, struct ethtool_gfeatures *cmd)
> +virNetDevGFeatureAvailable(int fd,
> + struct ifreq *ifr,
> + struct ethtool_gfeatures *cmd)
> {
> - cmd = (void*)cmd;
> - if (virNetDevSendEthtoolIoctl(ifname, cmd) == 0)
> + ifr->ifr_data = (void*)cmd;
> + if (virNetDevSendEthtoolIoctl(fd, ifr) == 0)
> return !!FEATURE_BIT_IS_SET(cmd->features, TX_UDP_TNL, active);
> return false;
> }
> @@ -3343,7 +3335,8 @@ virNetDevGFeatureAvailable(const char *ifname, struct ethtool_gfeatures *cmd)
>
> static int
> virNetDevGetEthtoolGFeatures(virBitmapPtr bitmap,
> - const char *ifname)
> + int fd,
> + struct ifreq *ifr)
Broken formatting.
> {
> struct ethtool_gfeatures *g_cmd;
>
[...]
> @@ -3391,14 +3389,23 @@ virNetDevGetFeatures(const char *ifname,
> return 0;
> }
>
> - virNetDevGetEthtoolFeatures(*out, ifname);
> + /* Ultimately uses AF_PACKET for socket which requires privileged
> + * daemon support.
> + */
> + if ((fd = virNetDevSetupControl(ifname, &ifr)) < 0)
> + goto cleanup;
>
> - if (virNetDevGetEthtoolGFeatures(*out, ifname) < 0)
> - return -1;
> + virNetDevGetEthtoolFeatures(*out, fd, &ifr);
> +
> + if (virNetDevGetEthtoolGFeatures(*out, fd, &ifr) < 0)
> + goto cleanup;
>
> if (virNetDevRDMAFeature(ifname, out) < 0)
> - return -1;
> - return 0;
> + goto cleanup;
> +
> + ret = 0;
> + cleanup:
You forgot to close the socket.
> + return ret;
> }
> #else
> int
ACK with the issues fixed.
More information about the libvir-list
mailing list