diff mbox series

[1/2] virtio: introduce virtio_dev_to_node helper

Message ID 20210926145518.64164-1-mgurtovoy@nvidia.com (mailing list archive)
State New, archived
Headers show
Series [1/2] virtio: introduce virtio_dev_to_node helper | expand

Commit Message

Max Gurtovoy Sept. 26, 2021, 2:55 p.m. UTC
Also expose numa_node field as a sysfs attribute. Now virtio device
drivers will be able to allocate memory that is node-local to the
device. This significantly helps performance and it's oftenly used in
other drivers such as NVMe, for example.

Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
---
 drivers/virtio/virtio.c | 10 ++++++++++
 include/linux/virtio.h  | 13 +++++++++++++
 2 files changed, 23 insertions(+)

Comments

Stefan Hajnoczi Sept. 27, 2021, 8:02 a.m. UTC | #1
On Sun, Sep 26, 2021 at 05:55:17PM +0300, Max Gurtovoy wrote:
> Also expose numa_node field as a sysfs attribute. Now virtio device
> drivers will be able to allocate memory that is node-local to the
> device. This significantly helps performance and it's oftenly used in
> other drivers such as NVMe, for example.
> 
> Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
> ---
>  drivers/virtio/virtio.c | 10 ++++++++++
>  include/linux/virtio.h  | 13 +++++++++++++
>  2 files changed, 23 insertions(+)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Michael S. Tsirkin Sept. 27, 2021, 9:31 a.m. UTC | #2
On Sun, Sep 26, 2021 at 05:55:17PM +0300, Max Gurtovoy wrote:
> Also expose numa_node field as a sysfs attribute. Now virtio device
> drivers will be able to allocate memory that is node-local to the
> device. This significantly helps performance and it's oftenly used in
> other drivers such as NVMe, for example.
> 
> Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>

If you have to respin this, it is better to split this in
two patches, one with the helper one adding a sysfs attribute.


> ---
>  drivers/virtio/virtio.c | 10 ++++++++++
>  include/linux/virtio.h  | 13 +++++++++++++
>  2 files changed, 23 insertions(+)
> 
> diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
> index 588e02fb91d3..bdbd76c5c58c 100644
> --- a/drivers/virtio/virtio.c
> +++ b/drivers/virtio/virtio.c
> @@ -60,12 +60,22 @@ static ssize_t features_show(struct device *_d,
>  }
>  static DEVICE_ATTR_RO(features);
>  
> +static ssize_t numa_node_show(struct device *_d,
> +			      struct device_attribute *attr, char *buf)
> +{
> +	struct virtio_device *vdev = dev_to_virtio(_d);
> +
> +	return sysfs_emit(buf, "%d\n", virtio_dev_to_node(vdev));
> +}
> +static DEVICE_ATTR_RO(numa_node);
> +
>  static struct attribute *virtio_dev_attrs[] = {
>  	&dev_attr_device.attr,
>  	&dev_attr_vendor.attr,
>  	&dev_attr_status.attr,
>  	&dev_attr_modalias.attr,
>  	&dev_attr_features.attr,
> +	&dev_attr_numa_node.attr,
>  	NULL,
>  };
>  ATTRIBUTE_GROUPS(virtio_dev);
> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
> index 41edbc01ffa4..05b586ac71d1 100644
> --- a/include/linux/virtio.h
> +++ b/include/linux/virtio.h
> @@ -125,6 +125,19 @@ static inline struct virtio_device *dev_to_virtio(struct device *_dev)
>  	return container_of(_dev, struct virtio_device, dev);
>  }
>  
> +/**
> + * virtio_dev_to_node - return the NUMA node for a given virtio device
> + * @vdev:	device to get the NUMA node for.
> + */
> +static inline int virtio_dev_to_node(struct virtio_device *vdev)
> +{
> +	struct device *parent = vdev->dev.parent;
> +
> +	if (!parent)
> +		return NUMA_NO_NODE;
> +	return dev_to_node(parent);
> +}
> +
>  void virtio_add_status(struct virtio_device *dev, unsigned int status);
>  int register_virtio_device(struct virtio_device *dev);
>  void unregister_virtio_device(struct virtio_device *dev);
> -- 
> 2.18.1
Max Gurtovoy Sept. 28, 2021, 4:14 p.m. UTC | #3
On 9/27/2021 12:31 PM, Michael S. Tsirkin wrote:
> On Sun, Sep 26, 2021 at 05:55:17PM +0300, Max Gurtovoy wrote:
>> Also expose numa_node field as a sysfs attribute. Now virtio device
>> drivers will be able to allocate memory that is node-local to the
>> device. This significantly helps performance and it's oftenly used in
>> other drivers such as NVMe, for example.
>>
>> Signed-off-by: Max Gurtovoy <mgurtovoy@nvidia.com>
> If you have to respin this, it is better to split this in
> two patches, one with the helper one adding a sysfs attribute.

It's not a problem, but it will cause the first commit to include a 
method that is not used anywhere.

I'm not sure this is preferred but I can do it.

>
>
>> ---
>>   drivers/virtio/virtio.c | 10 ++++++++++
>>   include/linux/virtio.h  | 13 +++++++++++++
>>   2 files changed, 23 insertions(+)
>>
>> diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
>> index 588e02fb91d3..bdbd76c5c58c 100644
>> --- a/drivers/virtio/virtio.c
>> +++ b/drivers/virtio/virtio.c
>> @@ -60,12 +60,22 @@ static ssize_t features_show(struct device *_d,
>>   }
>>   static DEVICE_ATTR_RO(features);
>>   
>> +static ssize_t numa_node_show(struct device *_d,
>> +			      struct device_attribute *attr, char *buf)
>> +{
>> +	struct virtio_device *vdev = dev_to_virtio(_d);
>> +
>> +	return sysfs_emit(buf, "%d\n", virtio_dev_to_node(vdev));
>> +}
>> +static DEVICE_ATTR_RO(numa_node);
>> +
>>   static struct attribute *virtio_dev_attrs[] = {
>>   	&dev_attr_device.attr,
>>   	&dev_attr_vendor.attr,
>>   	&dev_attr_status.attr,
>>   	&dev_attr_modalias.attr,
>>   	&dev_attr_features.attr,
>> +	&dev_attr_numa_node.attr,
>>   	NULL,
>>   };
>>   ATTRIBUTE_GROUPS(virtio_dev);
>> diff --git a/include/linux/virtio.h b/include/linux/virtio.h
>> index 41edbc01ffa4..05b586ac71d1 100644
>> --- a/include/linux/virtio.h
>> +++ b/include/linux/virtio.h
>> @@ -125,6 +125,19 @@ static inline struct virtio_device *dev_to_virtio(struct device *_dev)
>>   	return container_of(_dev, struct virtio_device, dev);
>>   }
>>   
>> +/**
>> + * virtio_dev_to_node - return the NUMA node for a given virtio device
>> + * @vdev:	device to get the NUMA node for.
>> + */
>> +static inline int virtio_dev_to_node(struct virtio_device *vdev)
>> +{
>> +	struct device *parent = vdev->dev.parent;
>> +
>> +	if (!parent)
>> +		return NUMA_NO_NODE;
>> +	return dev_to_node(parent);
>> +}
>> +
>>   void virtio_add_status(struct virtio_device *dev, unsigned int status);
>>   int register_virtio_device(struct virtio_device *dev);
>>   void unregister_virtio_device(struct virtio_device *dev);
>> -- 
>> 2.18.1
diff mbox series

Patch

diff --git a/drivers/virtio/virtio.c b/drivers/virtio/virtio.c
index 588e02fb91d3..bdbd76c5c58c 100644
--- a/drivers/virtio/virtio.c
+++ b/drivers/virtio/virtio.c
@@ -60,12 +60,22 @@  static ssize_t features_show(struct device *_d,
 }
 static DEVICE_ATTR_RO(features);
 
+static ssize_t numa_node_show(struct device *_d,
+			      struct device_attribute *attr, char *buf)
+{
+	struct virtio_device *vdev = dev_to_virtio(_d);
+
+	return sysfs_emit(buf, "%d\n", virtio_dev_to_node(vdev));
+}
+static DEVICE_ATTR_RO(numa_node);
+
 static struct attribute *virtio_dev_attrs[] = {
 	&dev_attr_device.attr,
 	&dev_attr_vendor.attr,
 	&dev_attr_status.attr,
 	&dev_attr_modalias.attr,
 	&dev_attr_features.attr,
+	&dev_attr_numa_node.attr,
 	NULL,
 };
 ATTRIBUTE_GROUPS(virtio_dev);
diff --git a/include/linux/virtio.h b/include/linux/virtio.h
index 41edbc01ffa4..05b586ac71d1 100644
--- a/include/linux/virtio.h
+++ b/include/linux/virtio.h
@@ -125,6 +125,19 @@  static inline struct virtio_device *dev_to_virtio(struct device *_dev)
 	return container_of(_dev, struct virtio_device, dev);
 }
 
+/**
+ * virtio_dev_to_node - return the NUMA node for a given virtio device
+ * @vdev:	device to get the NUMA node for.
+ */
+static inline int virtio_dev_to_node(struct virtio_device *vdev)
+{
+	struct device *parent = vdev->dev.parent;
+
+	if (!parent)
+		return NUMA_NO_NODE;
+	return dev_to_node(parent);
+}
+
 void virtio_add_status(struct virtio_device *dev, unsigned int status);
 int register_virtio_device(struct virtio_device *dev);
 void unregister_virtio_device(struct virtio_device *dev);