David Marchand 18218713bf enforce experimental tag at beginning of declarations
Putting a '__attribute__((deprecated))' in the middle of a function
prototype does not result in the expected result with gcc (while clang
is fine with this syntax).

$ cat deprecated.c
void * __attribute__((deprecated)) incorrect() { return 0; }
__attribute__((deprecated)) void *correct(void) { return 0; }
int main(int argc, char *argv[]) { incorrect(); correct(); return 0; }
$ gcc -o deprecated.o -c deprecated.c
deprecated.c: In function ‘main’:
deprecated.c:3:1: warning: ‘correct’ is deprecated (declared at
deprecated.c:2) [-Wdeprecated-declarations]
 int main(int argc, char *argv[]) { incorrect(); correct(); return 0; }
 ^

Move the tag on a separate line and make it the first thing of function
prototypes.
This is not perfect but we will trust reviewers to catch the other not
so easy to detect patterns.

sed -i \
     -e '/^\([^#].*\)\?__rte_experimental */{' \
     -e 's//\1/; s/ *$//; i\' \
     -e __rte_experimental \
     -e '/^$/d}' \
     $(git grep -l __rte_experimental -- '*.h')

Special mention for rte_mbuf_data_addr_default():

There is either a bug or a (not yet understood) issue with gcc.
gcc won't drop this inline when unused and rte_mbuf_data_addr_default()
calls rte_mbuf_buf_addr() which itself is experimental.
This results in a build warning when not accepting experimental apis
from sources just including rte_mbuf.h.

For this specific case, we hide the call to rte_mbuf_buf_addr() under
the ALLOW_EXPERIMENTAL_API flag.

Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
Signed-off-by: David Marchand <david.marchand@redhat.com>
2019-06-29 19:04:48 +02:00

204 lines
4.1 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2018 Intel Corporation
*/
#ifndef _RTE_VDPA_H_
#define _RTE_VDPA_H_
/**
* @file
*
* Device specific vhost lib
*/
#include <stdbool.h>
#include <rte_pci.h>
#include "rte_vhost.h"
#define MAX_VDPA_NAME_LEN 128
enum vdpa_addr_type {
PCI_ADDR,
VDPA_ADDR_MAX
};
/**
* vdpa device address
*/
struct rte_vdpa_dev_addr {
/** vdpa address type */
enum vdpa_addr_type type;
/** vdpa pci address */
union {
uint8_t __dummy[64];
struct rte_pci_addr pci_addr;
};
};
/**
* vdpa device operations
*/
struct rte_vdpa_dev_ops {
/** Get capabilities of this device */
int (*get_queue_num)(int did, uint32_t *queue_num);
/** Get supported features of this device */
int (*get_features)(int did, uint64_t *features);
/** Get supported protocol features of this device */
int (*get_protocol_features)(int did, uint64_t *protocol_features);
/** Driver configure/close the device */
int (*dev_conf)(int vid);
int (*dev_close)(int vid);
/** Enable/disable this vring */
int (*set_vring_state)(int vid, int vring, int state);
/** Set features when changed */
int (*set_features)(int vid);
/** Destination operations when migration done */
int (*migration_done)(int vid);
/** Get the vfio group fd */
int (*get_vfio_group_fd)(int vid);
/** Get the vfio device fd */
int (*get_vfio_device_fd)(int vid);
/** Get the notify area info of the queue */
int (*get_notify_area)(int vid, int qid,
uint64_t *offset, uint64_t *size);
/** Reserved for future extension */
void *reserved[5];
};
/**
* vdpa device structure includes device address and device operations.
*/
struct rte_vdpa_device {
/** vdpa device address */
struct rte_vdpa_dev_addr addr;
/** vdpa device operations */
struct rte_vdpa_dev_ops *ops;
} __rte_cache_aligned;
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Register a vdpa device
*
* @param addr
* the vdpa device address
* @param ops
* the vdpa device operations
* @return
* device id on success, -1 on failure
*/
__rte_experimental
int
rte_vdpa_register_device(struct rte_vdpa_dev_addr *addr,
struct rte_vdpa_dev_ops *ops);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Unregister a vdpa device
*
* @param did
* vdpa device id
* @return
* device id on success, -1 on failure
*/
__rte_experimental
int
rte_vdpa_unregister_device(int did);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Find the device id of a vdpa device
*
* @param addr
* the vdpa device address
* @return
* device id on success, -1 on failure
*/
__rte_experimental
int
rte_vdpa_find_device_id(struct rte_vdpa_dev_addr *addr);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Find a vdpa device based on device id
*
* @param did
* device id
* @return
* rte_vdpa_device on success, NULL on failure
*/
__rte_experimental
struct rte_vdpa_device *
rte_vdpa_get_device(int did);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Get current available vdpa device number
*
* @return
* available vdpa device number
*/
__rte_experimental
int
rte_vdpa_get_device_num(void);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Enable/Disable host notifier mapping for a vdpa port.
*
* @param vid
* vhost device id
* @param enable
* true for host notifier map, false for host notifier unmap
* @return
* 0 on success, -1 on failure
*/
__rte_experimental
int
rte_vhost_host_notifier_ctrl(int vid, bool enable);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Synchronize the used ring from mediated ring to guest, log dirty
* page for each writeable buffer, caller should handle the used
* ring logging before device stop.
*
* @param vid
* vhost device id
* @param qid
* vhost queue id
* @param vring_m
* mediated virtio ring pointer
* @return
* number of synced used entries on success, -1 on failure
*/
__rte_experimental
int
rte_vdpa_relay_vring_used(int vid, uint16_t qid, void *vring_m);
#endif /* _RTE_VDPA_H_ */