mirror of
https://github.com/torvalds/linux
synced 2024-09-20 02:57:25 +00:00
virtio: Add transport feature handling stub for virtio_ring.
To prepare for virtio_ring transport feature bits, hook in a call in all the users to manipulate them. This currently just clears all the bits, since it doesn't understand any features. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
c624896e48
commit
e34f872567
|
@ -105,6 +105,9 @@ static void lg_finalize_features(struct virtio_device *vdev)
|
||||||
/* Second half of bitmap is features we accept. */
|
/* Second half of bitmap is features we accept. */
|
||||||
u8 *out_features = lg_features(desc) + desc->feature_len;
|
u8 *out_features = lg_features(desc) + desc->feature_len;
|
||||||
|
|
||||||
|
/* Give virtio_ring a chance to accept features. */
|
||||||
|
vring_transport_features(vdev);
|
||||||
|
|
||||||
memset(out_features, 0, desc->feature_len);
|
memset(out_features, 0, desc->feature_len);
|
||||||
bits = min_t(unsigned, desc->feature_len, sizeof(vdev->features)) * 8;
|
bits = min_t(unsigned, desc->feature_len, sizeof(vdev->features)) * 8;
|
||||||
for (i = 0; i < bits; i++) {
|
for (i = 0; i < bits; i++) {
|
||||||
|
|
|
@ -95,6 +95,9 @@ static void kvm_finalize_features(struct virtio_device *vdev)
|
||||||
/* Second half of bitmap is features we accept. */
|
/* Second half of bitmap is features we accept. */
|
||||||
u8 *out_features = kvm_vq_features(desc) + desc->feature_len;
|
u8 *out_features = kvm_vq_features(desc) + desc->feature_len;
|
||||||
|
|
||||||
|
/* Give virtio_ring a chance to accept features. */
|
||||||
|
vring_transport_features(vdev);
|
||||||
|
|
||||||
memset(out_features, 0, desc->feature_len);
|
memset(out_features, 0, desc->feature_len);
|
||||||
bits = min_t(unsigned, desc->feature_len, sizeof(vdev->features)) * 8;
|
bits = min_t(unsigned, desc->feature_len, sizeof(vdev->features)) * 8;
|
||||||
for (i = 0; i < bits; i++) {
|
for (i = 0; i < bits; i++) {
|
||||||
|
|
|
@ -99,6 +99,9 @@ static void vp_finalize_features(struct virtio_device *vdev)
|
||||||
{
|
{
|
||||||
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
|
struct virtio_pci_device *vp_dev = to_vp_device(vdev);
|
||||||
|
|
||||||
|
/* Give virtio_ring a chance to accept features. */
|
||||||
|
vring_transport_features(vdev);
|
||||||
|
|
||||||
/* We only support 32 feature bits. */
|
/* We only support 32 feature bits. */
|
||||||
BUILD_BUG_ON(ARRAY_SIZE(vdev->features) != 1);
|
BUILD_BUG_ON(ARRAY_SIZE(vdev->features) != 1);
|
||||||
iowrite32(vdev->features[0], vp_dev->ioaddr+VIRTIO_PCI_GUEST_FEATURES);
|
iowrite32(vdev->features[0], vp_dev->ioaddr+VIRTIO_PCI_GUEST_FEATURES);
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
#include <linux/virtio.h>
|
#include <linux/virtio.h>
|
||||||
#include <linux/virtio_ring.h>
|
#include <linux/virtio_ring.h>
|
||||||
|
#include <linux/virtio_config.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -323,4 +324,19 @@ void vring_del_virtqueue(struct virtqueue *vq)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(vring_del_virtqueue);
|
EXPORT_SYMBOL_GPL(vring_del_virtqueue);
|
||||||
|
|
||||||
|
/* Manipulates transport-specific feature bits. */
|
||||||
|
void vring_transport_features(struct virtio_device *vdev)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
for (i = VIRTIO_TRANSPORT_F_START; i < VIRTIO_TRANSPORT_F_END; i++) {
|
||||||
|
switch (i) {
|
||||||
|
default:
|
||||||
|
/* We don't understand this bit. */
|
||||||
|
clear_bit(i, vdev->features);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(vring_transport_features);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
|
@ -120,6 +120,8 @@ struct virtqueue *vring_new_virtqueue(unsigned int num,
|
||||||
void (*notify)(struct virtqueue *vq),
|
void (*notify)(struct virtqueue *vq),
|
||||||
void (*callback)(struct virtqueue *vq));
|
void (*callback)(struct virtqueue *vq));
|
||||||
void vring_del_virtqueue(struct virtqueue *vq);
|
void vring_del_virtqueue(struct virtqueue *vq);
|
||||||
|
/* Filter out transport-specific feature bits. */
|
||||||
|
void vring_transport_features(struct virtio_device *vdev);
|
||||||
|
|
||||||
irqreturn_t vring_interrupt(int irq, void *_vq);
|
irqreturn_t vring_interrupt(int irq, void *_vq);
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
Loading…
Reference in a new issue