11a1bfac9SNikolay Nikolaev /* 21a1bfac9SNikolay Nikolaev * vhost-backend 31a1bfac9SNikolay Nikolaev * 41a1bfac9SNikolay Nikolaev * Copyright (c) 2013 Virtual Open Systems Sarl. 51a1bfac9SNikolay Nikolaev * 61a1bfac9SNikolay Nikolaev * This work is licensed under the terms of the GNU GPL, version 2 or later. 71a1bfac9SNikolay Nikolaev * See the COPYING file in the top-level directory. 81a1bfac9SNikolay Nikolaev * 91a1bfac9SNikolay Nikolaev */ 101a1bfac9SNikolay Nikolaev 111a1bfac9SNikolay Nikolaev #include "hw/virtio/vhost.h" 121a1bfac9SNikolay Nikolaev #include "hw/virtio/vhost-backend.h" 131a1bfac9SNikolay Nikolaev #include "qemu/error-report.h" 141a1bfac9SNikolay Nikolaev 151a1bfac9SNikolay Nikolaev #include <sys/ioctl.h> 161a1bfac9SNikolay Nikolaev 171a1bfac9SNikolay Nikolaev static int vhost_kernel_call(struct vhost_dev *dev, unsigned long int request, 181a1bfac9SNikolay Nikolaev void *arg) 191a1bfac9SNikolay Nikolaev { 201a1bfac9SNikolay Nikolaev int fd = (uintptr_t) dev->opaque; 211a1bfac9SNikolay Nikolaev 221a1bfac9SNikolay Nikolaev assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_KERNEL); 231a1bfac9SNikolay Nikolaev 241a1bfac9SNikolay Nikolaev return ioctl(fd, request, arg); 251a1bfac9SNikolay Nikolaev } 261a1bfac9SNikolay Nikolaev 271a1bfac9SNikolay Nikolaev static int vhost_kernel_init(struct vhost_dev *dev, void *opaque) 281a1bfac9SNikolay Nikolaev { 291a1bfac9SNikolay Nikolaev assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_KERNEL); 301a1bfac9SNikolay Nikolaev 311a1bfac9SNikolay Nikolaev dev->opaque = opaque; 321a1bfac9SNikolay Nikolaev 331a1bfac9SNikolay Nikolaev return 0; 341a1bfac9SNikolay Nikolaev } 351a1bfac9SNikolay Nikolaev 361a1bfac9SNikolay Nikolaev static int vhost_kernel_cleanup(struct vhost_dev *dev) 371a1bfac9SNikolay Nikolaev { 381a1bfac9SNikolay Nikolaev int fd = (uintptr_t) dev->opaque; 391a1bfac9SNikolay Nikolaev 401a1bfac9SNikolay Nikolaev assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_KERNEL); 411a1bfac9SNikolay Nikolaev 421a1bfac9SNikolay Nikolaev return close(fd); 431a1bfac9SNikolay Nikolaev } 441a1bfac9SNikolay Nikolaev 451a1bfac9SNikolay Nikolaev static const VhostOps kernel_ops = { 461a1bfac9SNikolay Nikolaev .backend_type = VHOST_BACKEND_TYPE_KERNEL, 471a1bfac9SNikolay Nikolaev .vhost_call = vhost_kernel_call, 481a1bfac9SNikolay Nikolaev .vhost_backend_init = vhost_kernel_init, 491a1bfac9SNikolay Nikolaev .vhost_backend_cleanup = vhost_kernel_cleanup 501a1bfac9SNikolay Nikolaev }; 511a1bfac9SNikolay Nikolaev 521a1bfac9SNikolay Nikolaev int vhost_set_backend_type(struct vhost_dev *dev, VhostBackendType backend_type) 531a1bfac9SNikolay Nikolaev { 541a1bfac9SNikolay Nikolaev int r = 0; 551a1bfac9SNikolay Nikolaev 561a1bfac9SNikolay Nikolaev switch (backend_type) { 571a1bfac9SNikolay Nikolaev case VHOST_BACKEND_TYPE_KERNEL: 581a1bfac9SNikolay Nikolaev dev->vhost_ops = &kernel_ops; 591a1bfac9SNikolay Nikolaev break; 605f6f6664SNikolay Nikolaev case VHOST_BACKEND_TYPE_USER: 615f6f6664SNikolay Nikolaev dev->vhost_ops = &user_ops; 625f6f6664SNikolay Nikolaev break; 631a1bfac9SNikolay Nikolaev default: 64*c6547661SGonglei error_report("Unknown vhost backend type"); 651a1bfac9SNikolay Nikolaev r = -1; 661a1bfac9SNikolay Nikolaev } 671a1bfac9SNikolay Nikolaev 681a1bfac9SNikolay Nikolaev return r; 691a1bfac9SNikolay Nikolaev } 70