mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
virtio: use u32, not bitmap for features
It seemed like a good idea to use bitmap for features in struct virtio_device, but it's actually a pain, and seems to become even more painful when we get more than 32 feature bits. Just change it to a u32 for now. Based on patch by Rusty. Suggested-by: David Hildenbrand <[email protected]> Signed-off-by: Rusty Russell <[email protected]> Signed-off-by: Cornelia Huck <[email protected]> Signed-off-by: Michael S. Tsirkin <[email protected]> Reviewed-by: Cornelia Huck <[email protected]>
This commit is contained in:
parent
d4024af56f
commit
e16e12be34
16 changed files with 42 additions and 74 deletions
|
|
@ -6,31 +6,11 @@
|
|||
/* TODO: empty stubs for now. Broken but enough for virtio_ring.c */
|
||||
#define list_add_tail(a, b) do {} while (0)
|
||||
#define list_del(a) do {} while (0)
|
||||
|
||||
#define BIT_WORD(nr) ((nr) / BITS_PER_LONG)
|
||||
#define BITS_PER_BYTE 8
|
||||
#define BITS_PER_LONG (sizeof(long) * BITS_PER_BYTE)
|
||||
#define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG))
|
||||
|
||||
/* TODO: Not atomic as it should be:
|
||||
* we don't use this for anything important. */
|
||||
static inline void clear_bit(int nr, volatile unsigned long *addr)
|
||||
{
|
||||
unsigned long mask = BIT_MASK(nr);
|
||||
unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
|
||||
|
||||
*p &= ~mask;
|
||||
}
|
||||
|
||||
static inline int test_bit(int nr, const volatile unsigned long *addr)
|
||||
{
|
||||
return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));
|
||||
}
|
||||
/* end of stubs */
|
||||
|
||||
struct virtio_device {
|
||||
void *dev;
|
||||
unsigned long features[1];
|
||||
u32 features;
|
||||
};
|
||||
|
||||
struct virtqueue {
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@
|
|||
#define VIRTIO_TRANSPORT_F_END 32
|
||||
|
||||
#define virtio_has_feature(dev, feature) \
|
||||
test_bit((feature), (dev)->features)
|
||||
(__virtio_test_bit((dev), feature))
|
||||
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ void vhost_vq_setup(struct vdev_info *dev, struct vq_info *info)
|
|||
{
|
||||
struct vhost_vring_state state = { .index = info->idx };
|
||||
struct vhost_vring_file file = { .index = info->idx };
|
||||
unsigned long long features = dev->vdev.features[0];
|
||||
unsigned long long features = dev->vdev.features;
|
||||
struct vhost_vring_addr addr = {
|
||||
.index = info->idx,
|
||||
.desc_user_addr = (uint64_t)(unsigned long)info->vring.desc,
|
||||
|
|
@ -113,8 +113,7 @@ static void vdev_info_init(struct vdev_info* dev, unsigned long long features)
|
|||
{
|
||||
int r;
|
||||
memset(dev, 0, sizeof *dev);
|
||||
dev->vdev.features[0] = features;
|
||||
dev->vdev.features[1] = features >> 32;
|
||||
dev->vdev.features = features;
|
||||
dev->buf_size = 1024;
|
||||
dev->buf = malloc(dev->buf_size);
|
||||
assert(dev->buf);
|
||||
|
|
|
|||
|
|
@ -304,7 +304,7 @@ static int parallel_test(unsigned long features,
|
|||
close(to_guest[1]);
|
||||
close(to_host[0]);
|
||||
|
||||
gvdev.vdev.features[0] = features;
|
||||
gvdev.vdev.features = features;
|
||||
gvdev.to_host_fd = to_host[1];
|
||||
gvdev.notifies = 0;
|
||||
|
||||
|
|
@ -449,13 +449,13 @@ int main(int argc, char *argv[])
|
|||
bool fast_vringh = false, parallel = false;
|
||||
|
||||
getrange = getrange_iov;
|
||||
vdev.features[0] = 0;
|
||||
vdev.features = 0;
|
||||
|
||||
while (argv[1]) {
|
||||
if (strcmp(argv[1], "--indirect") == 0)
|
||||
vdev.features[0] |= (1 << VIRTIO_RING_F_INDIRECT_DESC);
|
||||
__virtio_set_bit(&vdev, VIRTIO_RING_F_INDIRECT_DESC);
|
||||
else if (strcmp(argv[1], "--eventidx") == 0)
|
||||
vdev.features[0] |= (1 << VIRTIO_RING_F_EVENT_IDX);
|
||||
__virtio_set_bit(&vdev, VIRTIO_RING_F_EVENT_IDX);
|
||||
else if (strcmp(argv[1], "--slow-range") == 0)
|
||||
getrange = getrange_slow;
|
||||
else if (strcmp(argv[1], "--fast-vringh") == 0)
|
||||
|
|
@ -468,7 +468,7 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
if (parallel)
|
||||
return parallel_test(vdev.features[0], getrange, fast_vringh);
|
||||
return parallel_test(vdev.features, getrange, fast_vringh);
|
||||
|
||||
if (posix_memalign(&__user_addr_min, PAGE_SIZE, USER_MEM) != 0)
|
||||
abort();
|
||||
|
|
@ -483,7 +483,7 @@ int main(int argc, char *argv[])
|
|||
|
||||
/* Set up host side. */
|
||||
vring_init(&vrh.vring, RINGSIZE, __user_addr_min, ALIGN);
|
||||
vringh_init_user(&vrh, vdev.features[0], RINGSIZE, true,
|
||||
vringh_init_user(&vrh, vdev.features, RINGSIZE, true,
|
||||
vrh.vring.desc, vrh.vring.avail, vrh.vring.used);
|
||||
|
||||
/* No descriptor to get yet... */
|
||||
|
|
@ -652,13 +652,13 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
/* Test weird (but legal!) indirect. */
|
||||
if (vdev.features[0] & (1 << VIRTIO_RING_F_INDIRECT_DESC)) {
|
||||
if (__virtio_test_bit(&vdev, VIRTIO_RING_F_INDIRECT_DESC)) {
|
||||
char *data = __user_addr_max - USER_MEM/4;
|
||||
struct vring_desc *d = __user_addr_max - USER_MEM/2;
|
||||
struct vring vring;
|
||||
|
||||
/* Force creation of direct, which we modify. */
|
||||
vdev.features[0] &= ~(1 << VIRTIO_RING_F_INDIRECT_DESC);
|
||||
__virtio_clear_bit(&vdev, VIRTIO_RING_F_INDIRECT_DESC);
|
||||
vq = vring_new_virtqueue(0, RINGSIZE, ALIGN, &vdev, true,
|
||||
__user_addr_min,
|
||||
never_notify_host,
|
||||
|
|
|
|||
Loading…
Reference in a new issue