Re: [PATCH] virtio: sanity check on callback of virtio drivers

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

 



On Wed, Nov 23, 2022 at 11:32:27PM +0800, Dawei Li wrote:
> This commit includes changes below:
> 
> 1 Since register_virtio_driver doesn't force probe & remove
>   to be mandatory callback, so it's caller's job to make the
>   sanity check before invocation.

What's the point of these checks? I don't see how any driver
won't have these set. Why waste memory checking?

> 2 Replace sprintf with sysfs_emit or its variants for their
>   built-in PAGE_SIZE awareness.

this makes sense.

> Signed-off-by: Dawei Li <set_pte_at@xxxxxxxxxxx>
> ---
>  drivers/virtio/virtio.c | 23 +++++++++++++----------
>  1 file changed, 13 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
> index 828ced060742..e391a8dff333 100644
> --- a/drivers/virtio/virtio.c
> +++ b/drivers/virtio/virtio.c
> @@ -15,7 +15,7 @@ static ssize_t device_show(struct device *_d,
>  			   struct device_attribute *attr, char *buf)
>  {
>  	struct virtio_device *dev = dev_to_virtio(_d);
> -	return sprintf(buf, "0x%04x\n", dev->id.device);
> +	return sysfs_emit(buf, "0x%04x\n", dev->id.device);
>  }
>  static DEVICE_ATTR_RO(device);
>  
> @@ -23,7 +23,7 @@ static ssize_t vendor_show(struct device *_d,
>  			   struct device_attribute *attr, char *buf)
>  {
>  	struct virtio_device *dev = dev_to_virtio(_d);
> -	return sprintf(buf, "0x%04x\n", dev->id.vendor);
> +	return sysfs_emit(buf, "0x%04x\n", dev->id.vendor);
>  }
>  static DEVICE_ATTR_RO(vendor);
>  
> @@ -31,7 +31,7 @@ static ssize_t status_show(struct device *_d,
>  			   struct device_attribute *attr, char *buf)
>  {
>  	struct virtio_device *dev = dev_to_virtio(_d);
> -	return sprintf(buf, "0x%08x\n", dev->config->get_status(dev));
> +	return sysfs_emit(buf, "0x%08x\n", dev->config->get_status(dev));
>  }
>  static DEVICE_ATTR_RO(status);
>  
> @@ -39,7 +39,7 @@ static ssize_t modalias_show(struct device *_d,
>  			     struct device_attribute *attr, char *buf)
>  {
>  	struct virtio_device *dev = dev_to_virtio(_d);
> -	return sprintf(buf, "virtio:d%08Xv%08X\n",
> +	return sysfs_emit(buf, "virtio:d%08Xv%08X\n",
>  		       dev->id.device, dev->id.vendor);
>  }
>  static DEVICE_ATTR_RO(modalias);
> @@ -54,9 +54,9 @@ static ssize_t features_show(struct device *_d,
>  	/* We actually represent this as a bitstring, as it could be
>  	 * arbitrary length in future. */
>  	for (i = 0; i < sizeof(dev->features)*8; i++)
> -		len += sprintf(buf+len, "%c",
> +		len += sysfs_emit_at(buf, len, "%c",
>  			       __virtio_test_bit(dev, i) ? '1' : '0');
> -	len += sprintf(buf+len, "\n");
> +	len += sysfs_emit_at(buf, len, "\n");
>  	return len;
>  }
>  static DEVICE_ATTR_RO(features);
> @@ -302,9 +302,11 @@ static int virtio_dev_probe(struct device *_d)
>  	if (err)
>  		goto err;
>  
> -	err = drv->probe(dev);
> -	if (err)
> -		goto err;
> +	if (drv->probe) {
> +		err = drv->probe(dev);
> +		if (err)
> +			goto err;
> +	}
>  
>  	/* If probe didn't do it, mark device DRIVER_OK ourselves. */
>  	if (!(dev->config->get_status(dev) & VIRTIO_CONFIG_S_DRIVER_OK))
> @@ -329,7 +331,8 @@ static void virtio_dev_remove(struct device *_d)
>  
>  	virtio_config_disable(dev);
>  
> -	drv->remove(dev);
> +	if (drv->remove)
> +		drv->remove(dev);
>  
>  	/* Driver should have reset device. */
>  	WARN_ON_ONCE(dev->config->get_status(dev));
> -- 
> 2.25.1

_______________________________________________
Virtualization mailing list
Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linuxfoundation.org/mailman/listinfo/virtualization



[Index of Archives]     [KVM Development]     [Libvirt Development]     [Libvirt Users]     [CentOS Virtualization]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux