Home | History | Annotate | Download | only in linux
      1 #ifndef _LINUX_VHOST_H
      2 #define _LINUX_VHOST_H
      3 /* Userspace interface for in-kernel virtio accelerators. */
      4 
      5 /* vhost is used to reduce the number of system calls involved in virtio.
      6  *
      7  * Existing virtio net code is used in the guest without modification.
      8  *
      9  * This header includes interface used by userspace hypervisor for
     10  * device configuration.
     11  */
     12 
     13 #include <linux/types.h>
     14 
     15 #include <linux/ioctl.h>
     16 #include <linux/virtio_config.h>
     17 #include <linux/virtio_ring.h>
     18 
     19 struct vhost_vring_state {
     20 	unsigned int index;
     21 	unsigned int num;
     22 };
     23 
     24 struct vhost_vring_file {
     25 	unsigned int index;
     26 	int fd; /* Pass -1 to unbind from file. */
     27 
     28 };
     29 
     30 struct vhost_vring_addr {
     31 	unsigned int index;
     32 	/* Option flags. */
     33 	unsigned int flags;
     34 	/* Flag values: */
     35 	/* Whether log address is valid. If set enables logging. */
     36 #define VHOST_VRING_F_LOG 0
     37 
     38 	/* Start of array of descriptors (virtually contiguous) */
     39 	__u64 desc_user_addr;
     40 	/* Used structure address. Must be 32 bit aligned */
     41 	__u64 used_user_addr;
     42 	/* Available structure address. Must be 16 bit aligned */
     43 	__u64 avail_user_addr;
     44 	/* Logging support. */
     45 	/* Log writes to used structure, at offset calculated from specified
     46 	 * address. Address must be 32 bit aligned. */
     47 	__u64 log_guest_addr;
     48 };
     49 
     50 struct vhost_memory_region {
     51 	__u64 guest_phys_addr;
     52 	__u64 memory_size; /* bytes */
     53 	__u64 userspace_addr;
     54 	__u64 flags_padding; /* No flags are currently specified. */
     55 };
     56 
     57 /* All region addresses and sizes must be 4K aligned. */
     58 #define VHOST_PAGE_SIZE 0x1000
     59 
     60 struct vhost_memory {
     61 	__u32 nregions;
     62 	__u32 padding;
     63 	struct vhost_memory_region regions[0];
     64 };
     65 
     66 /* ioctls */
     67 
     68 #define VHOST_VIRTIO 0xAF
     69 
     70 /* Features bitmask for forward compatibility.  Transport bits are used for
     71  * vhost specific features. */
     72 #define VHOST_GET_FEATURES	_IOR(VHOST_VIRTIO, 0x00, __u64)
     73 #define VHOST_SET_FEATURES	_IOW(VHOST_VIRTIO, 0x00, __u64)
     74 
     75 /* Set current process as the (exclusive) owner of this file descriptor.  This
     76  * must be called before any other vhost command.  Further calls to
     77  * VHOST_OWNER_SET fail until VHOST_OWNER_RESET is called. */
     78 #define VHOST_SET_OWNER _IO(VHOST_VIRTIO, 0x01)
     79 /* Give up ownership, and reset the device to default values.
     80  * Allows subsequent call to VHOST_OWNER_SET to succeed. */
     81 #define VHOST_RESET_OWNER _IO(VHOST_VIRTIO, 0x02)
     82 
     83 /* Set up/modify memory layout */
     84 #define VHOST_SET_MEM_TABLE	_IOW(VHOST_VIRTIO, 0x03, struct vhost_memory)
     85 
     86 /* Write logging setup. */
     87 /* Memory writes can optionally be logged by setting bit at an offset
     88  * (calculated from the physical address) from specified log base.
     89  * The bit is set using an atomic 32 bit operation. */
     90 /* Set base address for logging. */
     91 #define VHOST_SET_LOG_BASE _IOW(VHOST_VIRTIO, 0x04, __u64)
     92 /* Specify an eventfd file descriptor to signal on log write. */
     93 #define VHOST_SET_LOG_FD _IOW(VHOST_VIRTIO, 0x07, int)
     94 
     95 /* Ring setup. */
     96 /* Set number of descriptors in ring. This parameter can not
     97  * be modified while ring is running (bound to a device). */
     98 #define VHOST_SET_VRING_NUM _IOW(VHOST_VIRTIO, 0x10, struct vhost_vring_state)
     99 /* Set addresses for the ring. */
    100 #define VHOST_SET_VRING_ADDR _IOW(VHOST_VIRTIO, 0x11, struct vhost_vring_addr)
    101 /* Base value where queue looks for available descriptors */
    102 #define VHOST_SET_VRING_BASE _IOW(VHOST_VIRTIO, 0x12, struct vhost_vring_state)
    103 /* Get accessor: reads index, writes value in num */
    104 #define VHOST_GET_VRING_BASE _IOWR(VHOST_VIRTIO, 0x12, struct vhost_vring_state)
    105 
    106 /* The following ioctls use eventfd file descriptors to signal and poll
    107  * for events. */
    108 
    109 /* Set eventfd to poll for added buffers */
    110 #define VHOST_SET_VRING_KICK _IOW(VHOST_VIRTIO, 0x20, struct vhost_vring_file)
    111 /* Set eventfd to signal when buffers have beed used */
    112 #define VHOST_SET_VRING_CALL _IOW(VHOST_VIRTIO, 0x21, struct vhost_vring_file)
    113 /* Set eventfd to signal an error */
    114 #define VHOST_SET_VRING_ERR _IOW(VHOST_VIRTIO, 0x22, struct vhost_vring_file)
    115 
    116 /* VHOST_NET specific defines */
    117 
    118 /* Attach virtio net ring to a raw socket, or tap device.
    119  * The socket must be already bound to an ethernet device, this device will be
    120  * used for transmit.  Pass fd -1 to unbind from the socket and the transmit
    121  * device.  This can be used to stop the ring (e.g. for migration). */
    122 #define VHOST_NET_SET_BACKEND _IOW(VHOST_VIRTIO, 0x30, struct vhost_vring_file)
    123 
    124 /* Feature bits */
    125 /* Log all write descriptors. Can be changed while device is active. */
    126 #define VHOST_F_LOG_ALL 26
    127 /* vhost-net should add virtio_net_hdr for RX, and strip for TX packets. */
    128 #define VHOST_NET_F_VIRTIO_NET_HDR 27
    129 
    130 #endif
    131