Commit 70e8257b authored by Jason Wang's avatar Jason Wang Committed by Pengyuan Zhao
Browse files

virtio_pci_modern: introduce helper to map vq notify area

stable inclusion
from stable-v5.13
commit 9e3bb9b7
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I5WXCZ
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=9e3bb9b79a7131a088cfffbdcc30e747dad9d090



----------------------------------------------------------------------

This patch factors out the logic of vq notify area mapping. Following
patches will switch to use this common helpers for both virtio_pci
library and virtio-pci vDPA driver.

Signed-off-by: default avatarJason Wang <jasowang@redhat.com>
Link: https://lore.kernel.org/r/20210415073147.19331-2-jasowang@redhat.com


Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Reviewed-by: default avatarEli Cohen <elic@nvidia.com>
Signed-off-by: default avatarPengyuan Zhao <zhaopengyuan@hisilicon.com>
parent 44570726
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -593,6 +593,41 @@ u16 vp_modern_get_queue_notify_off(struct virtio_pci_modern_device *mdev,
}
EXPORT_SYMBOL_GPL(vp_modern_get_queue_notify_off);

/*
 * vp_modern_map_vq_notify - map notification area for a
 * specific virtqueue
 * @mdev: the modern virtio-pci device
 * @index: the queue index
 *
 * Returns the address of the notification area
 */
void *vp_modern_map_vq_notify(struct virtio_pci_modern_device *mdev,
			      u16 index)
{
	u16 off = vp_modern_get_queue_notify_off(mdev, index);

	if (mdev->notify_base) {
		/* offset should not wrap */
		if ((u64)off * mdev->notify_offset_multiplier + 2
			> mdev->notify_len) {
			dev_warn(&mdev->pci_dev->dev,
				 "bad notification offset %u (x %u) "
				 "for queue %u > %zd",
				 off, mdev->notify_offset_multiplier,
				 index, mdev->notify_len);
			return NULL;
		}
		return (void __force *)mdev->notify_base +
			off * mdev->notify_offset_multiplier;
	} else {
		return (void __force *)vp_modern_map_capability(mdev,
				       mdev->notify_map_cap, 2, 2,
				       off * mdev->notify_offset_multiplier, 2,
				       NULL);
	}
}
EXPORT_SYMBOL_GPL(vp_modern_map_vq_notify);

MODULE_VERSION("0.1");
MODULE_DESCRIPTION("Modern Virtio PCI Device");
MODULE_AUTHOR("Jason Wang <jasowang@redhat.com>");
+2 −0
Original line number Diff line number Diff line
@@ -106,6 +106,8 @@ void __iomem *vp_modern_map_capability(struct virtio_pci_modern_device *mdev, in
				       u32 align,
				       u32 start, u32 size,
				       size_t *len);
void *vp_modern_map_vq_notify(struct virtio_pci_modern_device *mdev,
                              u16 index);
int vp_modern_probe(struct virtio_pci_modern_device *mdev);
void vp_modern_remove(struct virtio_pci_modern_device *mdev);
#endif