qemu/subprojects/libvduse/libvduse.h
<<
>>
Prefs
   1/*
   2 * VDUSE (vDPA Device in Userspace) library
   3 *
   4 * Copyright (C) 2022 Bytedance Inc. and/or its affiliates. All rights reserved.
   5 *
   6 * Author:
   7 *   Xie Yongji <xieyongji@bytedance.com>
   8 *
   9 * This work is licensed under the terms of the GNU GPL, version 2 or
  10 * later.  See the COPYING file in the top-level directory.
  11 */
  12
  13#ifndef LIBVDUSE_H
  14#define LIBVDUSE_H
  15
  16#include <stdint.h>
  17#include <sys/uio.h>
  18
  19#define VIRTQUEUE_MAX_SIZE 1024
  20
  21/* VDUSE device structure */
  22typedef struct VduseDev VduseDev;
  23
  24/* Virtqueue structure */
  25typedef struct VduseVirtq VduseVirtq;
  26
  27/* Some operation of VDUSE backend */
  28typedef struct VduseOps {
  29    /* Called when virtqueue can be processed */
  30    void (*enable_queue)(VduseDev *dev, VduseVirtq *vq);
  31    /* Called when virtqueue processing should be stopped */
  32    void (*disable_queue)(VduseDev *dev, VduseVirtq *vq);
  33} VduseOps;
  34
  35/* Describing elements of the I/O buffer */
  36typedef struct VduseVirtqElement {
  37    /* Descriptor table index */
  38    unsigned int index;
  39    /* Number of physically-contiguous device-readable descriptors */
  40    unsigned int out_num;
  41    /* Number of physically-contiguous device-writable descriptors */
  42    unsigned int in_num;
  43    /* Array to store physically-contiguous device-writable descriptors */
  44    struct iovec *in_sg;
  45    /* Array to store physically-contiguous device-readable descriptors */
  46    struct iovec *out_sg;
  47} VduseVirtqElement;
  48
  49
  50/**
  51 * vduse_get_virtio_features:
  52 *
  53 * Get supported virtio features
  54 *
  55 * Returns: supported feature bits
  56 */
  57uint64_t vduse_get_virtio_features(void);
  58
  59/**
  60 * vduse_queue_get_dev:
  61 * @vq: specified virtqueue
  62 *
  63 * Get corresponding VDUSE device from the virtqueue.
  64 *
  65 * Returns: a pointer to VDUSE device on success, NULL on failure.
  66 */
  67VduseDev *vduse_queue_get_dev(VduseVirtq *vq);
  68
  69/**
  70 * vduse_queue_get_fd:
  71 * @vq: specified virtqueue
  72 *
  73 * Get the kick fd for the virtqueue.
  74 *
  75 * Returns: file descriptor on success, -1 on failure.
  76 */
  77int vduse_queue_get_fd(VduseVirtq *vq);
  78
  79/**
  80 * vduse_queue_pop:
  81 * @vq: specified virtqueue
  82 * @sz: the size of struct to return (must be >= VduseVirtqElement)
  83 *
  84 * Pop an element from virtqueue available ring.
  85 *
  86 * Returns: a pointer to a structure containing VduseVirtqElement on success,
  87 * NULL on failure.
  88 */
  89void *vduse_queue_pop(VduseVirtq *vq, size_t sz);
  90
  91/**
  92 * vduse_queue_push:
  93 * @vq: specified virtqueue
  94 * @elem: pointer to VduseVirtqElement returned by vduse_queue_pop()
  95 * @len: length in bytes to write
  96 *
  97 * Push an element to virtqueue used ring.
  98 */
  99void vduse_queue_push(VduseVirtq *vq, const VduseVirtqElement *elem,
 100                      unsigned int len);
 101/**
 102 * vduse_queue_notify:
 103 * @vq: specified virtqueue
 104 *
 105 * Request to notify the queue.
 106 */
 107void vduse_queue_notify(VduseVirtq *vq);
 108
 109/**
 110 * vduse_dev_get_priv:
 111 * @dev: VDUSE device
 112 *
 113 * Get the private pointer passed to vduse_dev_create().
 114 *
 115 * Returns: private pointer on success, NULL on failure.
 116 */
 117void *vduse_dev_get_priv(VduseDev *dev);
 118
 119/**
 120 * vduse_dev_get_queue:
 121 * @dev: VDUSE device
 122 * @index: virtqueue index
 123 *
 124 * Get the specified virtqueue.
 125 *
 126 * Returns: a pointer to the virtqueue on success, NULL on failure.
 127 */
 128VduseVirtq *vduse_dev_get_queue(VduseDev *dev, int index);
 129
 130/**
 131 * vduse_dev_get_fd:
 132 * @dev: VDUSE device
 133 *
 134 * Get the control message fd for the VDUSE device.
 135 *
 136 * Returns: file descriptor on success, -1 on failure.
 137 */
 138int vduse_dev_get_fd(VduseDev *dev);
 139
 140/**
 141 * vduse_dev_handler:
 142 * @dev: VDUSE device
 143 *
 144 * Used to process the control message.
 145 *
 146 * Returns: file descriptor on success, -errno on failure.
 147 */
 148int vduse_dev_handler(VduseDev *dev);
 149
 150/**
 151 * vduse_dev_update_config:
 152 * @dev: VDUSE device
 153 * @size: the size to write to configuration space
 154 * @offset: the offset from the beginning of configuration space
 155 * @buffer: the buffer used to write from
 156 *
 157 * Update device configuration space and inject a config interrupt.
 158 *
 159 * Returns: 0 on success, -errno on failure.
 160 */
 161int vduse_dev_update_config(VduseDev *dev, uint32_t size,
 162                            uint32_t offset, char *buffer);
 163
 164/**
 165 * vduse_dev_setup_queue:
 166 * @dev: VDUSE device
 167 * @index: virtqueue index
 168 * @max_size: the max size of virtqueue
 169 *
 170 * Setup the specified virtqueue.
 171 *
 172 * Returns: 0 on success, -errno on failure.
 173 */
 174int vduse_dev_setup_queue(VduseDev *dev, int index, int max_size);
 175
 176/**
 177 * vduse_set_reconnect_log_file:
 178 * @dev: VDUSE device
 179 * @file: filename of reconnect log
 180 *
 181 * Specify the file to store log for reconnecting. It should
 182 * be called before vduse_dev_setup_queue().
 183 *
 184 * Returns: 0 on success, -errno on failure.
 185 */
 186int vduse_set_reconnect_log_file(VduseDev *dev, const char *filename);
 187
 188/**
 189 * vduse_dev_create_by_fd:
 190 * @fd: passed file descriptor
 191 * @num_queues: the number of virtqueues
 192 * @ops: the operation of VDUSE backend
 193 * @priv: private pointer
 194 *
 195 * Create VDUSE device from a passed file descriptor.
 196 *
 197 * Returns: pointer to VDUSE device on success, NULL on failure.
 198 */
 199VduseDev *vduse_dev_create_by_fd(int fd, uint16_t num_queues,
 200                                 const VduseOps *ops, void *priv);
 201
 202/**
 203 * vduse_dev_create_by_name:
 204 * @name: VDUSE device name
 205 * @num_queues: the number of virtqueues
 206 * @ops: the operation of VDUSE backend
 207 * @priv: private pointer
 208 *
 209 * Create VDUSE device on /dev/vduse/$NAME.
 210 *
 211 * Returns: pointer to VDUSE device on success, NULL on failure.
 212 */
 213VduseDev *vduse_dev_create_by_name(const char *name, uint16_t num_queues,
 214                                   const VduseOps *ops, void *priv);
 215
 216/**
 217 * vduse_dev_create:
 218 * @name: VDUSE device name
 219 * @device_id: virtio device id
 220 * @vendor_id: virtio vendor id
 221 * @features: virtio features
 222 * @num_queues: the number of virtqueues
 223 * @config_size: the size of the configuration space
 224 * @config: the buffer of the configuration space
 225 * @ops: the operation of VDUSE backend
 226 * @priv: private pointer
 227 *
 228 * Create VDUSE device.
 229 *
 230 * Returns: pointer to VDUSE device on success, NULL on failure.
 231 */
 232VduseDev *vduse_dev_create(const char *name, uint32_t device_id,
 233                           uint32_t vendor_id, uint64_t features,
 234                           uint16_t num_queues, uint32_t config_size,
 235                           char *config, const VduseOps *ops, void *priv);
 236
 237/**
 238 * vduse_dev_destroy:
 239 * @dev: VDUSE device
 240 *
 241 * Destroy the VDUSE device.
 242 *
 243 * Returns: 0 on success, -errno on failure.
 244 */
 245int vduse_dev_destroy(VduseDev *dev);
 246
 247#endif
 248