posix_memalign() returns zero or a positive error number and does not set
errno.  virtio_test and vhost_net_test assert that the return is not
negative, which will always be true, and the userspace __get_free_page()
ignores it, so a failed allocation continues without setting the pointer

Assert a zero return in the tests, and return 0 from __get_free_page() on
failure, as the kernel's does.

Signed-off-by: Liam R. Howlett (Google) <[email protected]>
---
 tools/virtio/linux/kernel.h   | 3 ++-
 tools/virtio/vhost_net_test.c | 2 +-
 tools/virtio/virtio_test.c    | 2 +-
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/tools/virtio/linux/kernel.h b/tools/virtio/linux/kernel.h
index 104abf9d1aee5..3497660c690a9 100644
--- a/tools/virtio/linux/kernel.h
+++ b/tools/virtio/linux/kernel.h
@@ -106,7 +106,8 @@ static inline unsigned long __get_free_page(gfp_t gfp)
 {
        void *p;
 
-       posix_memalign(&p, PAGE_SIZE, PAGE_SIZE);
+       if (posix_memalign(&p, PAGE_SIZE, PAGE_SIZE))
+               return 0;
        return (unsigned long)p;
 }
 
diff --git a/tools/virtio/vhost_net_test.c b/tools/virtio/vhost_net_test.c
index 566e15420bb65..3122ea0970568 100644
--- a/tools/virtio/vhost_net_test.c
+++ b/tools/virtio/vhost_net_test.c
@@ -197,7 +197,7 @@ static void vq_info_add(struct vdev_info *dev, int idx, int 
num, int fd)
        info->idx = idx;
        info->kick = eventfd(0, EFD_NONBLOCK);
        r = posix_memalign(&info->ring, 4096, vring_size(num, 4096));
-       assert(r >= 0);
+       assert(!r);
        vq_reset(info, num, &dev->vdev);
        vhost_vq_setup(dev, info);
 
diff --git a/tools/virtio/virtio_test.c b/tools/virtio/virtio_test.c
index 028f54e6854a8..9d61463f6e09b 100644
--- a/tools/virtio/virtio_test.c
+++ b/tools/virtio/virtio_test.c
@@ -116,7 +116,7 @@ static void vq_info_add(struct vdev_info *dev, int num)
        info->kick = eventfd(0, EFD_NONBLOCK);
        info->call = eventfd(0, EFD_NONBLOCK);
        r = posix_memalign(&info->ring, 4096, vring_size(num, 4096));
-       assert(r >= 0);
+       assert(!r);
        vq_reset(info, num, &dev->vdev);
        vhost_vq_setup(dev, info);
        dev->fds[info->idx].fd = info->call;
-- 
2.47.3


Reply via email to