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 |
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>
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
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 --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);
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(+)