* [PATCH v2 0/2] docs: driver-api: virtio: virtio on Linux
@ 2022-08-04 10:59 Ricardo Cañuelo
2022-08-04 10:59 ` [PATCH v2 1/2] virtio: kerneldocs fixes and enhancements Ricardo Cañuelo
2022-08-04 10:59 ` [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux Ricardo Cañuelo
0 siblings, 2 replies; 11+ messages in thread
From: Ricardo Cañuelo @ 2022-08-04 10:59 UTC (permalink / raw)
To: linux-doc; +Cc: virtualization, mst, jasowang, kernel, cohuck, bagasdotme
Basic documentation about virtio in the kernel and a small tutorial for
virtio drivers.
Tested on linux-next (next-20220802)
Changes in v2:
- virtio spec links updated to v1.2
- simplify virtio.rst and remove most low level parts that are
already covered by the spec
- split the kerneldocs fixes to a separate patch
- remove :c:func: rst formatting
Ricardo Cañuelo (2):
virtio: kerneldocs fixes and enhancements
docs: driver-api: virtio: virtio on Linux
Documentation/driver-api/index.rst | 1 +
Documentation/driver-api/virtio/index.rst | 11 +
Documentation/driver-api/virtio/virtio.rst | 151 ++++++++++++++
.../virtio/writing_virtio_drivers.rst | 189 ++++++++++++++++++
MAINTAINERS | 1 +
drivers/virtio/virtio_ring.c | 8 +
include/linux/virtio.h | 6 +-
include/linux/virtio_config.h | 6 +-
include/uapi/linux/virtio_ring.h | 16 +-
9 files changed, 378 insertions(+), 11 deletions(-)
create mode 100644 Documentation/driver-api/virtio/index.rst
create mode 100644 Documentation/driver-api/virtio/virtio.rst
create mode 100644 Documentation/driver-api/virtio/writing_virtio_drivers.rst
--
2.25.1
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v2 1/2] virtio: kerneldocs fixes and enhancements
2022-08-04 10:59 [PATCH v2 0/2] docs: driver-api: virtio: virtio on Linux Ricardo Cañuelo
@ 2022-08-04 10:59 ` Ricardo Cañuelo
2022-08-08 12:14 ` Cornelia Huck
2022-08-04 10:59 ` [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux Ricardo Cañuelo
1 sibling, 1 reply; 11+ messages in thread
From: Ricardo Cañuelo @ 2022-08-04 10:59 UTC (permalink / raw)
To: linux-doc
Cc: virtualization, mst, jasowang, kernel, cohuck, bagasdotme,
Ricardo Cañuelo
Fix variable names in some htmldocs, naming in others.
Add htmldocs for struct vring_desc and vring_interrupt.
Signed-off-by: Ricardo Cañuelo <ricardo.canuelo@collabora.com>
---
drivers/virtio/virtio_ring.c | 8 ++++++++
include/linux/virtio.h | 6 +++---
include/linux/virtio_config.h | 6 +++---
include/uapi/linux/virtio_ring.h | 16 +++++++++++-----
4 files changed, 25 insertions(+), 11 deletions(-)
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
index a5ec724c01d8..e2091345c5c2 100644
--- a/drivers/virtio/virtio_ring.c
+++ b/drivers/virtio/virtio_ring.c
@@ -2147,6 +2147,14 @@ static inline bool more_used(const struct vring_virtqueue *vq)
return vq->packed_ring ? more_used_packed(vq) : more_used_split(vq);
}
+/**
+ * vring_interrupt - notify a virtqueue on an interrupt
+ * @irq: the IRQ number
+ * @_vq: the struct virtqueue to notify
+ *
+ * Calls the callback function of @_vq to process the virtqueue
+ * notification.
+ */
irqreturn_t vring_interrupt(int irq, void *_vq)
{
struct vring_virtqueue *vq = to_vvq(_vq);
diff --git a/include/linux/virtio.h b/include/linux/virtio.h
index d8fdf170637c..fd8440e85933 100644
--- a/include/linux/virtio.h
+++ b/include/linux/virtio.h
@@ -11,7 +11,7 @@
#include <linux/gfp.h>
/**
- * virtqueue - a queue to register buffers for sending or receiving.
+ * struct virtqueue - a queue to register buffers for sending or receiving.
* @list: the chain of virtqueues for this device
* @callback: the function to call when buffers are consumed (can be NULL).
* @name: the name of this virtqueue (mainly for debugging)
@@ -90,7 +90,7 @@ dma_addr_t virtqueue_get_avail_addr(struct virtqueue *vq);
dma_addr_t virtqueue_get_used_addr(struct virtqueue *vq);
/**
- * virtio_device - representation of a device using virtio
+ * struct virtio_device - representation of a device using virtio
* @index: unique position on the virtio bus
* @failed: saved value for VIRTIO_CONFIG_S_FAILED bit (for restore)
* @config_enabled: configuration change reporting enabled
@@ -146,7 +146,7 @@ size_t virtio_max_dma_size(struct virtio_device *vdev);
list_for_each_entry(vq, &vdev->vqs, list)
/**
- * virtio_driver - operations for a virtio I/O driver
+ * struct virtio_driver - operations for a virtio I/O driver
* @driver: underlying device driver (populate name and owner).
* @id_table: the ids serviced by this driver.
* @feature_table: an array of feature numbers supported by this driver.
diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
index b47c2e7ed0ee..997801018ae4 100644
--- a/include/linux/virtio_config.h
+++ b/include/linux/virtio_config.h
@@ -225,7 +225,7 @@ int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
/**
* virtio_synchronize_cbs - synchronize with virtqueue callbacks
- * @vdev: the device
+ * @dev: the device
*/
static inline
void virtio_synchronize_cbs(struct virtio_device *dev)
@@ -244,7 +244,7 @@ void virtio_synchronize_cbs(struct virtio_device *dev)
/**
* virtio_device_ready - enable vq use in probe function
- * @vdev: the device
+ * @dev: the device
*
* Driver must call this to use vqs in the probe function.
*
@@ -292,7 +292,7 @@ const char *virtio_bus_name(struct virtio_device *vdev)
/**
* virtqueue_set_affinity - setting affinity for a virtqueue
* @vq: the virtqueue
- * @cpu: the cpu no.
+ * @cpu_mask: the cpu mask
*
* Pay attention the function are best-effort: the affinity hint may not be set
* due to config support, irq type and sharing.
diff --git a/include/uapi/linux/virtio_ring.h b/include/uapi/linux/virtio_ring.h
index 476d3e5c0fe7..f8c20d3de8da 100644
--- a/include/uapi/linux/virtio_ring.h
+++ b/include/uapi/linux/virtio_ring.h
@@ -93,15 +93,21 @@
#define VRING_USED_ALIGN_SIZE 4
#define VRING_DESC_ALIGN_SIZE 16
-/* Virtio ring descriptors: 16 bytes. These can chain together via "next". */
+/**
+ * struct vring_desc - Virtio ring descriptors,
+ * 16 bytes long. These can chain together via @next.
+ *
+ * @addr: buffer address (guest-physical)
+ * @len: buffer length
+ * @flags: descriptor flags
+ * @next: index of the next descriptor in the chain,
+ * if the VRING_DESC_F_NEXT flag is set. We chain unused
+ * descriptors via this, too.
+ */
struct vring_desc {
- /* Address (guest-physical). */
__virtio64 addr;
- /* Length. */
__virtio32 len;
- /* The flags as indicated above. */
__virtio16 flags;
- /* We chain unused descriptors via this, too */
__virtio16 next;
};
--
2.25.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux
2022-08-04 10:59 [PATCH v2 0/2] docs: driver-api: virtio: virtio on Linux Ricardo Cañuelo
2022-08-04 10:59 ` [PATCH v2 1/2] virtio: kerneldocs fixes and enhancements Ricardo Cañuelo
@ 2022-08-04 10:59 ` Ricardo Cañuelo
2022-08-06 7:58 ` Bagas Sanjaya
2022-08-08 13:47 ` Cornelia Huck
1 sibling, 2 replies; 11+ messages in thread
From: Ricardo Cañuelo @ 2022-08-04 10:59 UTC (permalink / raw)
To: linux-doc
Cc: virtualization, mst, jasowang, kernel, cohuck, bagasdotme,
Ricardo Cañuelo
Basic doc about Virtio on Linux and a short tutorial on Virtio drivers.
Signed-off-by: Ricardo Cañuelo <ricardo.canuelo@collabora.com>
---
Documentation/driver-api/index.rst | 1 +
Documentation/driver-api/virtio/index.rst | 11 +
Documentation/driver-api/virtio/virtio.rst | 151 ++++++++++++++
.../virtio/writing_virtio_drivers.rst | 189 ++++++++++++++++++
MAINTAINERS | 1 +
5 files changed, 353 insertions(+)
create mode 100644 Documentation/driver-api/virtio/index.rst
create mode 100644 Documentation/driver-api/virtio/virtio.rst
create mode 100644 Documentation/driver-api/virtio/writing_virtio_drivers.rst
diff --git a/Documentation/driver-api/index.rst b/Documentation/driver-api/index.rst
index d3a58f77328e..30a3de452b1d 100644
--- a/Documentation/driver-api/index.rst
+++ b/Documentation/driver-api/index.rst
@@ -106,6 +106,7 @@ available subsections can be seen below.
vfio-mediated-device
vfio
vfio-pci-device-specific-driver-acceptance
+ virtio/index
xilinx/index
xillybus
zorro
diff --git a/Documentation/driver-api/virtio/index.rst b/Documentation/driver-api/virtio/index.rst
new file mode 100644
index 000000000000..528b14b291e3
--- /dev/null
+++ b/Documentation/driver-api/virtio/index.rst
@@ -0,0 +1,11 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+======
+Virtio
+======
+
+.. toctree::
+ :maxdepth: 1
+
+ virtio
+ writing_virtio_drivers
diff --git a/Documentation/driver-api/virtio/virtio.rst b/Documentation/driver-api/virtio/virtio.rst
new file mode 100644
index 000000000000..4b73c705c94c
--- /dev/null
+++ b/Documentation/driver-api/virtio/virtio.rst
@@ -0,0 +1,151 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. _virtio:
+
+===============
+Virtio on Linux
+===============
+
+Introduction
+============
+
+Virtio is an open standard interface for virtual machines to access
+paravirtualized devices, ie. devices that aren't emulated by a
+hypervisor but rather real host devices that are exposed by the
+hypervisor to the guest to achieve native performance. In other words,
+it provides a communication mechanism for a guest OS to use devices on
+the host machine. Additionally, some devices also implement the virtio
+interface in hardware.
+
+For paravirtualized devices, the concrete hardware details of the real
+host devices are abstracted in the hypervisor, which provides a set of
+simplified virtual devices that implement the virtio protocol. These
+devices are defined in Chapter 5 ("Device Types") of the virtio spec [1]
+and they're the devices that the guest OS will ultimately handle. So, in
+that regard, the guest OS knows it's running in a virtual environment
+and that it needs to use the appropriate virtio drivers to handle the
+devices instead of the regular device drivers it'd use in a native or
+purely virtual environment (with emulated devices).
+
+
+Device - Driver communication: virtqueues
+=========================================
+
+Although the virtio devices are really an abstraction layer in the
+hypervisor, they're exposed to the guest as if they are physical devices
+using a specific transport method -- PCI, MMIO or CCW -- that is
+orthogonal to the device itself. The virtio spec defines these transport
+methods in detail, including device discovery, capabilities and
+interrupt handling.
+
+The communication between the driver in the guest OS and the device in
+the hypervisor is done through shared memory (that's what makes virtio
+devices so efficient) using specialized data structures called
+virtqueues, which are actually ring buffers [#f1]_ of buffer descriptors
+similar to the ones used in a network device:
+
+.. kernel-doc:: include/uapi/linux/virtio_ring.h
+ :identifiers: struct vring_desc
+
+All the buffers the descriptors point to are allocated by the guest and
+used by the host either for reading or for writing but not for both.
+
+Refer to Chapter 2.5 ("Virtqueues") of the virtio spec [1] for the
+reference definitions of virtqueues and to [2] for an illustrated
+overview of how the host device and the guest driver communicate.
+
+The :c:type:`vring_virtqueue` struct models a virtqueue, including the
+ring buffers and management data. Embedded in this struct is the
+:c:type:`virtqueue` struct, which is the data structure that's
+ultimately used by virtio drivers:
+
+.. kernel-doc:: include/linux/virtio.h
+ :identifiers: struct virtqueue
+
+The callback function pointed by this struct is triggered when the
+device has consumed the buffers provided by the driver. More
+specifically, the trigger will be an interrupt issued by the hypervisor
+(see vring_interrupt()). Interrupt request handlers are registered for
+a virtqueue during the virtqueue setup process (transport-specific).
+
+.. kernel-doc:: drivers/virtio/virtio_ring.c
+ :identifiers: vring_interrupt
+
+
+Device discovery and probing
+============================
+
+In the kernel, the virtio core contains the virtio bus driver and
+transport-specific drivers like `virtio-pci` and `virtio-mmio`. Then
+there are individual virtio drivers for specific device types that are
+registered to the virtio bus driver.
+
+How a virtio device is found and configured by the kernel depends on how
+the hypervisor defines it. Taking the `QEMU virtio-console
+<https://gitlab.com/qemu-project/qemu/-/blob/master/hw/char/virtio-console.c>`__
+device as an example. When using PCI as a transport method, the device
+will present itself in the PCI bus with vendor 0x1af4 (RedHat, Inc.) and
+device id 0x1003 (virtio console), as defined in the spec, so the kernel
+will detect it as it would do with any other PCI device.
+
+During the PCI enumeration process, if a device is found to match the
+virtio-pci driver (according to the virtio-pci device table, any PCI
+device with vendor id = 0x1af4)::
+
+ /* Qumranet donated their vendor ID for devices 0x1000 thru 0x10FF. */
+ static const struct pci_device_id virtio_pci_id_table[] = {
+ { PCI_DEVICE(PCI_VENDOR_ID_REDHAT_QUMRANET, PCI_ANY_ID) },
+ { 0 }
+ };
+
+then the virtio-pci driver is probed and, if the probing goes well, the
+device is registered to the virtio bus::
+
+ static int virtio_pci_probe(struct pci_dev *pci_dev,
+ const struct pci_device_id *id)
+ {
+ ...
+
+ if (force_legacy) {
+ rc = virtio_pci_legacy_probe(vp_dev);
+ /* Also try modern mode if we can't map BAR0 (no IO space). */
+ if (rc == -ENODEV || rc == -ENOMEM)
+ rc = virtio_pci_modern_probe(vp_dev);
+ if (rc)
+ goto err_probe;
+ } else {
+ rc = virtio_pci_modern_probe(vp_dev);
+ if (rc == -ENODEV)
+ rc = virtio_pci_legacy_probe(vp_dev);
+ if (rc)
+ goto err_probe;
+ }
+
+ ...
+
+ rc = register_virtio_device(&vp_dev->vdev);
+
+When the device is registered to the virtio bus the kernel will look
+for a driver in the bus that can handle the device and call that
+driver's ``probe`` method.
+
+It's at this stage that the virtqueues will be allocated and configured
+by calling the appropriate ``virtio_find`` helper function, such as
+virtio_find_single_vq() or virtio_find_vqs(), which will end up
+calling a transport-specific ``find_vqs`` method.
+
+
+References
+==========
+
+[1] Virtio Spec v1.2:
+https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html
+
+Check for later versions of the spec as well.
+
+[2] Virtqueues and virtio ring: How the data travels
+https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travels
+
+.. rubric:: Footnotes
+
+.. [#f1] that's why they may be also referred as virtrings.
diff --git a/Documentation/driver-api/virtio/writing_virtio_drivers.rst b/Documentation/driver-api/virtio/writing_virtio_drivers.rst
new file mode 100644
index 000000000000..139c785a38ef
--- /dev/null
+++ b/Documentation/driver-api/virtio/writing_virtio_drivers.rst
@@ -0,0 +1,189 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+.. _writing_virtio_drivers:
+
+======================
+Writing Virtio Drivers
+======================
+
+Introduction
+============
+
+Chapter 5 ("Device Types") in the virtio specification [1] defines all
+the supported virtio device types. Since these devices are, by
+definition, meant as abstractions for a wide variety of real hardware,
+the addition of new virtio drivers is not expected to be very
+frequent. Still, this document serves as a basic guideline for driver
+programmers that need to hack a new virtio driver or understand the
+essentials of the existing ones. See :ref:`Virtio on Linux <virtio>` for
+a general overview of virtio.
+
+
+Driver boilerplate
+==================
+
+As a bare minimum, a virtio driver should register in the virtio bus and
+configure the virtqueues for the device according to its spec, the
+configuration of the virtqueues in the driver side must match the
+virtqueue definitions in the device. A basic driver skeleton could look
+like this::
+
+ #include <linux/virtio.h>
+ #include <linux/virtio_ids.h>
+ #include <linux/virtio_config.h>
+ #include <linux/module.h>
+
+ /* device private data (one per device) */
+ struct virtio_dummy_dev {
+ struct virtqueue *vq;
+ };
+
+ static void virtio_dummy_recv_cb(struct virtqueue *vq)
+ {
+ struct virtio_dummy_dev *dev = vq->vdev->priv;
+ char *buf;
+ unsigned int len;
+
+ buf = virtqueue_get_buf(dev->vq, &len);
+ /* spurious callback? */
+ if (!buf)
+ return;
+
+ /* Process the received data */
+ }
+
+ static int virtio_dummy_probe(struct virtio_device *vdev)
+ {
+ struct virtio_dummy_dev *dev = NULL;
+
+ /* initialize device data */
+ dev = kzalloc(sizeof(struct virtio_dummy_dev), GFP_KERNEL);
+ if (!dev)
+ return -ENOMEM;
+
+ /* the device has a single virtqueue */
+ dev->vq = virtio_find_single_vq(vdev, virtio_dummy_recv_cb, "input");
+ if (IS_ERR(dev->vq)) {
+ kfree(dev);
+ return PTR_ERR(dev->vq);
+
+ }
+ vdev->priv = dev;
+
+ return 0;
+ }
+
+ static void virtio_dummy_remove(struct virtio_device *vdev)
+ {
+ struct virtio_dummy_dev *dev = vdev->priv;
+
+ /*
+ * Disable vq interrupts: equivalent to
+ * vdev->config->reset(vdev)
+ */
+ virtio_reset_device(vdev);
+
+ /* remove virtqueues */
+ vdev->config->del_vqs(vdev);
+
+ kfree(dev);
+ }
+
+ static const struct virtio_device_id id_table[] = {
+ { VIRTIO_ID_DUMMY, VIRTIO_DEV_ANY_ID },
+ { 0 },
+ };
+
+ static struct virtio_driver virtio_dummy_driver = {
+ .driver.name = KBUILD_MODNAME,
+ .driver.owner = THIS_MODULE,
+ .id_table = id_table,
+ .probe = virtio_dummy_probe,
+ .remove = virtio_dummy_remove,
+ };
+
+ module_virtio_driver(virtio_dummy_driver);
+ MODULE_DEVICE_TABLE(virtio, id_table);
+ MODULE_DESCRIPTION("Dummy virtio driver");
+ MODULE_LICENSE("GPL");
+
+The device id ``VIRTIO_ID_DUMMY`` here is a placeholder, virtio
+drivers should be defined only for devices that are defined in the
+spec. See include/uapi/linux/virtio_ids.h.
+
+If your driver doesn't have to do anything special in its ``init`` and
+``exit`` methods, you can use the module_virtio_driver() helper to
+reduce the amount of boilerplate code.
+
+The ``probe`` method does the minimum driver setup in this case
+(memory allocation for the device data) and initializes the
+virtqueue. The virtqueues are automatically enabled after ``probe``
+returns, sending the appropriate "DRIVER_OK" status signal to the
+device. If the virtqueues need to be enabled before ``probe`` ends, they
+can be manually enabled by calling virtio_device_ready():
+
+.. kernel-doc:: include/linux/virtio_config.h
+ :identifiers: virtio_device_ready
+
+
+Sending and receiving data
+==========================
+
+The virtio_dummy_recv_cb() callback in the code above will be triggered
+when the device notifies the driver after it finishes processing a
+descriptor or descriptor chain, either for reading or writing. However,
+that's only the second half of the virtio device-driver communication
+process, as the communication is always started by the driver regardless
+of the direction of the data transfer.
+
+To configure a buffer transfer from the driver to the device, first you
+have to add the buffers -- packed as `scatterlists` -- to the
+appropriate virtqueue using any of the virtqueue_add_inbuf(),
+virtqueue_add_outbuf() or virtqueue_add_sgs(), depending on whether you
+need to add one input `scatterlist` (for the device to fill in), one
+output `scatterlist` (for the device to consume) or multiple
+`scatterlists`, respectively. Then, once the virtqueue is set up, a call
+to virtqueue_kick() sends a notification that will be serviced by the
+hypervisor that implements the device::
+
+ struct scatterlist sg[1];
+ sg_init_one(sg, buffer, BUFLEN);
+ virtqueue_add_inbuf(dev->vq, sg, 1, buffer, GFP_ATOMIC);
+ virtqueue_kick(dev->vq);
+
+.. kernel-doc:: drivers/virtio/virtio_ring.c
+ :identifiers: virtqueue_add_inbuf
+
+.. kernel-doc:: drivers/virtio/virtio_ring.c
+ :identifiers: virtqueue_add_outbuf
+
+.. kernel-doc:: drivers/virtio/virtio_ring.c
+ :identifiers: virtqueue_add_sgs
+
+Then, after the device has read or written the buffers prepared by the
+driver and notifies it back, the driver can call virtqueue_get_buf() to
+read the data produced by the device (if the virtqueue was set up with
+input buffers) or simply to reclaim the buffers if they were already
+consumed by the device:
+
+.. kernel-doc:: drivers/virtio/virtio_ring.c
+ :identifiers: virtqueue_get_buf_ctx
+
+The virtqueue callbacks can be disabled and re-enabled using the
+virtqueue_disable_cb() and the family of virtqueue_enable_cb() functions
+respectively. See drivers/virtio/virtio_ring.c for more details:
+
+.. kernel-doc:: drivers/virtio/virtio_ring.c
+ :identifiers: virtqueue_disable_cb
+
+.. kernel-doc:: drivers/virtio/virtio_ring.c
+ :identifiers: virtqueue_enable_cb
+
+
+References
+==========
+
+[1] Virtio Spec v1.2:
+https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html
+
+Check for later versions of the spec as well.
diff --git a/MAINTAINERS b/MAINTAINERS
index 779f599f9abf..6ecdddb89da4 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -21488,6 +21488,7 @@ S: Maintained
F: Documentation/ABI/testing/sysfs-bus-vdpa
F: Documentation/ABI/testing/sysfs-class-vduse
F: Documentation/devicetree/bindings/virtio/
+F: Documentation/driver-api/virtio/
F: drivers/block/virtio_blk.c
F: drivers/crypto/virtio/
F: drivers/net/virtio_net.c
--
2.25.1
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux
2022-08-04 10:59 ` [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux Ricardo Cañuelo
@ 2022-08-06 7:58 ` Bagas Sanjaya
2022-08-08 9:06 ` Ricardo Cañuelo
2022-08-08 13:47 ` Cornelia Huck
1 sibling, 1 reply; 11+ messages in thread
From: Bagas Sanjaya @ 2022-08-06 7:58 UTC (permalink / raw)
To: Ricardo Cañuelo
Cc: linux-doc, virtualization, mst, jasowang, kernel, cohuck
[-- Attachment #1: Type: text/plain, Size: 2253 bytes --]
On Thu, Aug 04, 2022 at 12:59:14PM +0200, Ricardo Cañuelo wrote:
> +References
> +==========
> +
> +[1] Virtio Spec v1.2:
> +https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html
> +
> +Check for later versions of the spec as well.
> +
> +[2] Virtqueues and virtio ring: How the data travels
> +https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travels
> +
> +.. rubric:: Footnotes
> +
> +.. [#f1] that's why they may be also referred as virtrings.
Sphinx citation syntax can be used for external references, like:
diff --git a/Documentation/driver-api/virtio/virtio.rst b/Documentation/driver-api/virtio/virtio.rst
index 4b73c705c94c61..abd682cfd41eda 100644
--- a/Documentation/driver-api/virtio/virtio.rst
+++ b/Documentation/driver-api/virtio/virtio.rst
@@ -50,8 +50,8 @@ similar to the ones used in a network device:
All the buffers the descriptors point to are allocated by the guest and
used by the host either for reading or for writing but not for both.
-Refer to Chapter 2.5 ("Virtqueues") of the virtio spec [1] for the
-reference definitions of virtqueues and to [2] for an illustrated
+Refer to Chapter 2.5 ("Virtqueues") of the virtio spec [1]_ for the
+reference definitions of virtqueues and to [2]_ for an illustrated
overview of how the host device and the guest driver communicate.
The :c:type:`vring_virtqueue` struct models a virtqueue, including the
@@ -138,13 +138,13 @@ calling a transport-specific ``find_vqs`` method.
References
==========
-[1] Virtio Spec v1.2:
-https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html
+.. [1] Virtio Spec v1.2:
+ https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html
-Check for later versions of the spec as well.
+ Check for later versions of the spec as well.
-[2] Virtqueues and virtio ring: How the data travels
-https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travels
+.. [2] Virtqueues and virtio ring: How the data travels
+ https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travels
.. rubric:: Footnotes
Otherwise the documentation LGTM (no new warnings).
--
An old man doll... just what I always wanted! - Clara
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 273 bytes --]
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux
2022-08-06 7:58 ` Bagas Sanjaya
@ 2022-08-08 9:06 ` Ricardo Cañuelo
2022-08-08 12:31 ` Bagas Sanjaya
0 siblings, 1 reply; 11+ messages in thread
From: Ricardo Cañuelo @ 2022-08-08 9:06 UTC (permalink / raw)
To: Bagas Sanjaya; +Cc: linux-doc, virtualization, mst, jasowang, kernel, cohuck
Hi Bagas,
Thanks for reviewing the patch, comments below:
On sáb, ago 06 2022 at 14:58:08, Bagas Sanjaya <bagasdotme@gmail.com> wrote:
> Sphinx citation syntax can be used for external references, like:
>
> diff --git a/Documentation/driver-api/virtio/virtio.rst b/Documentation/driver-api/virtio/virtio.rst
> index 4b73c705c94c61..abd682cfd41eda 100644
> --- a/Documentation/driver-api/virtio/virtio.rst
> +++ b/Documentation/driver-api/virtio/virtio.rst
> @@ -50,8 +50,8 @@ similar to the ones used in a network device:
> All the buffers the descriptors point to are allocated by the guest and
> used by the host either for reading or for writing but not for both.
>
> -Refer to Chapter 2.5 ("Virtqueues") of the virtio spec [1] for the
> -reference definitions of virtqueues and to [2] for an illustrated
> +Refer to Chapter 2.5 ("Virtqueues") of the virtio spec [1]_ for the
> +reference definitions of virtqueues and to [2]_ for an illustrated
> overview of how the host device and the guest driver communicate.
>
> The :c:type:`vring_virtqueue` struct models a virtqueue, including the
> @@ -138,13 +138,13 @@ calling a transport-specific ``find_vqs`` method.
> References
> ==========
>
> -[1] Virtio Spec v1.2:
> -https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html
> +.. [1] Virtio Spec v1.2:
> + https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html
>
> -Check for later versions of the spec as well.
> + Check for later versions of the spec as well.
>
> -[2] Virtqueues and virtio ring: How the data travels
> -https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travels
> +.. [2] Virtqueues and virtio ring: How the data travels
> + https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travels
>
> .. rubric:: Footnotes
Is that the preferred way to do it? I didn't find any guidelines about
it and the existing docs don't seem to settle on any specific
style. Personally I prefer to keep it as it is in the patch because I
like the bibliography references to look different than footnote links
([] vs superscript).
Cheers,
Ricardo
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/2] virtio: kerneldocs fixes and enhancements
2022-08-04 10:59 ` [PATCH v2 1/2] virtio: kerneldocs fixes and enhancements Ricardo Cañuelo
@ 2022-08-08 12:14 ` Cornelia Huck
2022-08-08 12:52 ` Ricardo Cañuelo
0 siblings, 1 reply; 11+ messages in thread
From: Cornelia Huck @ 2022-08-08 12:14 UTC (permalink / raw)
To: Ricardo Cañuelo, linux-doc
Cc: virtualization, mst, jasowang, kernel, bagasdotme,
Ricardo Cañuelo
On Thu, Aug 04 2022, Ricardo Cañuelo <ricardo.canuelo@collabora.com> wrote:
> Fix variable names in some htmldocs, naming in others.
> Add htmldocs for struct vring_desc and vring_interrupt.
Isn't that "kerneldoc"? But maybe I'm a bit behind on the current
terminology.
>
> Signed-off-by: Ricardo Cañuelo <ricardo.canuelo@collabora.com>
> ---
> drivers/virtio/virtio_ring.c | 8 ++++++++
> include/linux/virtio.h | 6 +++---
> include/linux/virtio_config.h | 6 +++---
> include/uapi/linux/virtio_ring.h | 16 +++++++++++-----
> 4 files changed, 25 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
> index a5ec724c01d8..e2091345c5c2 100644
> --- a/drivers/virtio/virtio_ring.c
> +++ b/drivers/virtio/virtio_ring.c
> @@ -2147,6 +2147,14 @@ static inline bool more_used(const struct vring_virtqueue *vq)
> return vq->packed_ring ? more_used_packed(vq) : more_used_split(vq);
> }
>
> +/**
> + * vring_interrupt - notify a virtqueue on an interrupt
> + * @irq: the IRQ number
This is being ignored, however. Append "(ignored)"?
(I think it is only there so that this function can be used as an
irq_handler_t.)
> + * @_vq: the struct virtqueue to notify
> + *
> + * Calls the callback function of @_vq to process the virtqueue
> + * notification.
> + */
> irqreturn_t vring_interrupt(int irq, void *_vq)
> {
> struct vring_virtqueue *vq = to_vvq(_vq);
(...)
> diff --git a/include/linux/virtio_config.h b/include/linux/virtio_config.h
> index b47c2e7ed0ee..997801018ae4 100644
> --- a/include/linux/virtio_config.h
> +++ b/include/linux/virtio_config.h
> @@ -225,7 +225,7 @@ int virtio_find_vqs_ctx(struct virtio_device *vdev, unsigned nvqs,
>
> /**
> * virtio_synchronize_cbs - synchronize with virtqueue callbacks
> - * @vdev: the device
> + * @dev: the device
As you're touching this anyway: maybe s/device/virtio device/ ?
> */
> static inline
> void virtio_synchronize_cbs(struct virtio_device *dev)
> @@ -244,7 +244,7 @@ void virtio_synchronize_cbs(struct virtio_device *dev)
>
> /**
> * virtio_device_ready - enable vq use in probe function
> - * @vdev: the device
> + * @dev: the device
Same here.
> *
> * Driver must call this to use vqs in the probe function.
> *
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux
2022-08-08 9:06 ` Ricardo Cañuelo
@ 2022-08-08 12:31 ` Bagas Sanjaya
0 siblings, 0 replies; 11+ messages in thread
From: Bagas Sanjaya @ 2022-08-08 12:31 UTC (permalink / raw)
To: Ricardo Cañuelo
Cc: linux-doc, virtualization, mst, jasowang, kernel, cohuck
On 8/8/22 16:06, Ricardo Cañuelo wrote:
>> -[1] Virtio Spec v1.2:
>> -https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html
>> +.. [1] Virtio Spec v1.2:
>> + https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html
>>
>> -Check for later versions of the spec as well.
>> + Check for later versions of the spec as well.
>>
>> -[2] Virtqueues and virtio ring: How the data travels
>> -https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travels
>> +.. [2] Virtqueues and virtio ring: How the data travels
>> + https://www.redhat.com/en/blog/virtqueues-and-virtio-ring-how-data-travels
>>
>> .. rubric:: Footnotes
>
> Is that the preferred way to do it? I didn't find any guidelines about
> it and the existing docs don't seem to settle on any specific
> style. Personally I prefer to keep it as it is in the patch because I
> like the bibliography references to look different than footnote links
> ([] vs superscript).
>
I think the citation syntax is better suited for this case of external
references mentioned in a documentation.
--
An old man doll... just what I always wanted! - Clara
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 1/2] virtio: kerneldocs fixes and enhancements
2022-08-08 12:14 ` Cornelia Huck
@ 2022-08-08 12:52 ` Ricardo Cañuelo
0 siblings, 0 replies; 11+ messages in thread
From: Ricardo Cañuelo @ 2022-08-08 12:52 UTC (permalink / raw)
To: Cornelia Huck, linux-doc
Cc: virtualization, mst, jasowang, kernel, bagasdotme
Hi Cornelia, thanks for the review:
On lun, ago 08 2022 at 14:14:07, Cornelia Huck <cohuck@redhat.com> wrote:
> Isn't that "kerneldoc"? But maybe I'm a bit behind on the current
> terminology.
Ugh what a silly slip. You're totally right, I got kerneldocs and
htmldocs mixed in my head after so many "make htmldocs" tests.
> This is being ignored, however. Append "(ignored)"?
Ack.
> As you're touching this anyway: maybe s/device/virtio device/ ?
> ...
> Same here.
Sure, no problem. I'll prepare v3 with the fixes.
Cheers,
Ricardo
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux
2022-08-04 10:59 ` [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux Ricardo Cañuelo
2022-08-06 7:58 ` Bagas Sanjaya
@ 2022-08-08 13:47 ` Cornelia Huck
2022-08-09 13:05 ` Ricardo Cañuelo
1 sibling, 1 reply; 11+ messages in thread
From: Cornelia Huck @ 2022-08-08 13:47 UTC (permalink / raw)
To: Ricardo Cañuelo, linux-doc
Cc: virtualization, mst, jasowang, kernel, bagasdotme,
Ricardo Cañuelo
On Thu, Aug 04 2022, Ricardo Cañuelo <ricardo.canuelo@collabora.com> wrote:
> Basic doc about Virtio on Linux and a short tutorial on Virtio drivers.
>
> Signed-off-by: Ricardo Cañuelo <ricardo.canuelo@collabora.com>
> ---
> Documentation/driver-api/index.rst | 1 +
> Documentation/driver-api/virtio/index.rst | 11 +
> Documentation/driver-api/virtio/virtio.rst | 151 ++++++++++++++
> .../virtio/writing_virtio_drivers.rst | 189 ++++++++++++++++++
> MAINTAINERS | 1 +
> 5 files changed, 353 insertions(+)
> create mode 100644 Documentation/driver-api/virtio/index.rst
> create mode 100644 Documentation/driver-api/virtio/virtio.rst
> create mode 100644 Documentation/driver-api/virtio/writing_virtio_drivers.rst
(...)
> diff --git a/Documentation/driver-api/virtio/virtio.rst b/Documentation/driver-api/virtio/virtio.rst
> new file mode 100644
> index 000000000000..4b73c705c94c
> --- /dev/null
> +++ b/Documentation/driver-api/virtio/virtio.rst
> @@ -0,0 +1,151 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +
> +.. _virtio:
> +
> +===============
> +Virtio on Linux
> +===============
> +
> +Introduction
> +============
> +
> +Virtio is an open standard interface for virtual machines to access
> +paravirtualized devices, ie. devices that aren't emulated by a
> +hypervisor but rather real host devices that are exposed by the
> +hypervisor to the guest to achieve native performance. In other words,
> +it provides a communication mechanism for a guest OS to use devices on
> +the host machine. Additionally, some devices also implement the virtio
> +interface in hardware.
> +
> +For paravirtualized devices, the concrete hardware details of the real
> +host devices are abstracted in the hypervisor, which provides a set of
> +simplified virtual devices that implement the virtio protocol. These
> +devices are defined in Chapter 5 ("Device Types") of the virtio spec [1]
> +and they're the devices that the guest OS will ultimately handle. So, in
> +that regard, the guest OS knows it's running in a virtual environment
> +and that it needs to use the appropriate virtio drivers to handle the
> +devices instead of the regular device drivers it'd use in a native or
> +purely virtual environment (with emulated devices).
Hm... so I'm not quite happy with those two paragraphs, but I'm not sure
how to make it better.
- While the origins of virtio are hypervisor implementations, the
standard is describing the mechanisms of device <-> driver
communication, regardless whether the device is a hardware entity or
something emulated by a hypervisor.
- I'm not quite sure what you are referring to with "real host
devices". We can have e.g. a real disk that is handed to a guest via
virtio-blk as a whole, or we can have some kind of file that is
exposed via virtio-blk. Other device types can also be completely
emulated.
- The OS picks the driver depending on what device is discovers; virtio
device drivers are not any different from other device drivers in that
regard.
So I think the key pieces of virtio are the following:
- it is an open standard
- it describes a protocol, which can be used to implement a lot of
different device types
- those devices are exposed to the operating system via standard
mechanisms such as PCI
- virtio devices can be implemented in various ways, such as in
hypervisors (more common) or as a real hardware device
For the remainder of this document, it is probably fine to focus on the
hypervisor use case.
(...)
> +How a virtio device is found and configured by the kernel depends on how
> +the hypervisor defines it. Taking the `QEMU virtio-console
> +<https://gitlab.com/qemu-project/qemu/-/blob/master/hw/char/virtio-console.c>`__
> +device as an example. When using PCI as a transport method, the device
> +will present itself in the PCI bus with vendor 0x1af4 (RedHat, Inc.) and
s/in/on/ ?
s/RedHat/Red Hat/ :)
> +device id 0x1003 (virtio console), as defined in the spec, so the kernel
> +will detect it as it would do with any other PCI device.
(...)
> diff --git a/Documentation/driver-api/virtio/writing_virtio_drivers.rst b/Documentation/driver-api/virtio/writing_virtio_drivers.rst
> new file mode 100644
> index 000000000000..139c785a38ef
> --- /dev/null
> +++ b/Documentation/driver-api/virtio/writing_virtio_drivers.rst
> @@ -0,0 +1,189 @@
> +.. SPDX-License-Identifier: GPL-2.0
> +
> +.. _writing_virtio_drivers:
> +
> +======================
> +Writing Virtio Drivers
> +======================
> +
> +Introduction
> +============
> +
> +Chapter 5 ("Device Types") in the virtio specification [1] defines all
> +the supported virtio device types. Since these devices are, by
> +definition, meant as abstractions for a wide variety of real hardware,
See my comments above, virtio devices can also be fully emulated or real
hardware devices.
> +the addition of new virtio drivers is not expected to be very
> +frequent. Still, this document serves as a basic guideline for driver
I think we should not make any statement regarding frequency of new
additions; sometimes, there's a flurry of activity, sometimes, there's
nothing for ages :)
> +programmers that need to hack a new virtio driver or understand the
> +essentials of the existing ones. See :ref:`Virtio on Linux <virtio>` for
> +a general overview of virtio.
> +
> +
> +Driver boilerplate
> +==================
> +
> +As a bare minimum, a virtio driver should register in the virtio bus and
s/should/needs to/ ?
> +configure the virtqueues for the device according to its spec, the
> +configuration of the virtqueues in the driver side must match the
> +virtqueue definitions in the device. A basic driver skeleton could look
> +like this::
(...)
> +The device id ``VIRTIO_ID_DUMMY`` here is a placeholder, virtio
> +drivers should be defined only for devices that are defined in the
s/defined/added/ ?
> +spec. See include/uapi/linux/virtio_ids.h.
Maybe "Device ids need to be at least reserved in the virtio spec before
being added to that file." ?
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux
2022-08-08 13:47 ` Cornelia Huck
@ 2022-08-09 13:05 ` Ricardo Cañuelo
2022-08-09 14:28 ` Cornelia Huck
0 siblings, 1 reply; 11+ messages in thread
From: Ricardo Cañuelo @ 2022-08-09 13:05 UTC (permalink / raw)
To: Cornelia Huck, linux-doc
Cc: virtualization, mst, jasowang, kernel, bagasdotme
Hi Cornelia,
Thanks for the insightful comments and ideas. Answers below:
On lun, ago 08 2022 at 15:47:06, Cornelia Huck <cohuck@redhat.com> wrote:
> Hm... so I'm not quite happy with those two paragraphs, but I'm not sure
> how to make it better.
>
> - While the origins of virtio are hypervisor implementations, the
> standard is describing the mechanisms of device <-> driver
> communication, regardless whether the device is a hardware entity or
> something emulated by a hypervisor.
> - I'm not quite sure what you are referring to with "real host
> devices". We can have e.g. a real disk that is handed to a guest via
> virtio-blk as a whole, or we can have some kind of file that is
> exposed via virtio-blk. Other device types can also be completely
> emulated.
> - The OS picks the driver depending on what device is discovers; virtio
> device drivers are not any different from other device drivers in that
> regard.
>
> So I think the key pieces of virtio are the following:
>
> - it is an open standard
> - it describes a protocol, which can be used to implement a lot of
> different device types
> - those devices are exposed to the operating system via standard
> mechanisms such as PCI
> - virtio devices can be implemented in various ways, such as in
> hypervisors (more common) or as a real hardware device
>
> For the remainder of this document, it is probably fine to focus on the
> hypervisor use case.
How about this as an introduction?
Virtio is an open standard that defines a protocol to communicate
drivers and devices of different types, see Chapter 5 ("Device
Types") of the virtio spec `[1]`_. Originally developed as a
standard for paravirtualized devices implemented by a hypervisor, it
can be used to interface any compliant device (real or emulated)
with a driver.
For illustrative purposes, this document will focus on the common
case of a Linux kernel running in a virtual machine and using
paravirtualized devices provided by the hypervisor, which exposes
them as virtio devices via standard mechanisms such as PCI.
> s/in/on/ ?
> s/RedHat/Red Hat/ :)
Got it.
> See my comments above, virtio devices can also be fully emulated or real
> hardware devices.
>
> [...]
>
> I think we should not make any statement regarding frequency of new
> additions; sometimes, there's a flurry of activity, sometimes, there's
> nothing for ages :)
Ok, I'll simplify the intro to this:
This document serves as a basic guideline for driver programmers
that need to hack a new virtio driver or understand the essentials
of the existing ones. See :ref:`Virtio on Linux <virtio>` for a
general overview of virtio.
> s/should/needs to/ ?
Ack.
> s/defined/added/ ?
Ack.
> Maybe "Device ids need to be at least reserved in the virtio spec before
> being added to that file." ?
Sure, I'll add all of these to the next version.
Cheers,
Ricardo
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux
2022-08-09 13:05 ` Ricardo Cañuelo
@ 2022-08-09 14:28 ` Cornelia Huck
0 siblings, 0 replies; 11+ messages in thread
From: Cornelia Huck @ 2022-08-09 14:28 UTC (permalink / raw)
To: Ricardo Cañuelo, linux-doc
Cc: virtualization, mst, jasowang, kernel, bagasdotme
On Tue, Aug 09 2022, Ricardo Cañuelo <ricardo.canuelo@collabora.com> wrote:
> How about this as an introduction?
>
> Virtio is an open standard that defines a protocol to communicate
> drivers and devices of different types, see Chapter 5 ("Device
"...that defines a protocol for communication between drivers and
devices of different device types, see..."
> Types") of the virtio spec `[1]`_. Originally developed as a
> standard for paravirtualized devices implemented by a hypervisor, it
> can be used to interface any compliant device (real or emulated)
> with a driver.
>
> For illustrative purposes, this document will focus on the common
> case of a Linux kernel running in a virtual machine and using
> paravirtualized devices provided by the hypervisor, which exposes
> them as virtio devices via standard mechanisms such as PCI.
Sounds good to me.
(...)
> Ok, I'll simplify the intro to this:
>
> This document serves as a basic guideline for driver programmers
> that need to hack a new virtio driver or understand the essentials
> of the existing ones. See :ref:`Virtio on Linux <virtio>` for a
> general overview of virtio.
Ok.
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2022-08-09 14:28 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-08-04 10:59 [PATCH v2 0/2] docs: driver-api: virtio: virtio on Linux Ricardo Cañuelo
2022-08-04 10:59 ` [PATCH v2 1/2] virtio: kerneldocs fixes and enhancements Ricardo Cañuelo
2022-08-08 12:14 ` Cornelia Huck
2022-08-08 12:52 ` Ricardo Cañuelo
2022-08-04 10:59 ` [PATCH v2 2/2] docs: driver-api: virtio: virtio on Linux Ricardo Cañuelo
2022-08-06 7:58 ` Bagas Sanjaya
2022-08-08 9:06 ` Ricardo Cañuelo
2022-08-08 12:31 ` Bagas Sanjaya
2022-08-08 13:47 ` Cornelia Huck
2022-08-09 13:05 ` Ricardo Cañuelo
2022-08-09 14:28 ` Cornelia Huck
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).