Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix for some sync issues b/w qemu and dpdk-vdpa #1

Open
wants to merge 20 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
45fb355
INTERNAL: add helper file for Xilinx reviewboard setup
ol-andrewr Feb 26, 2021
0fd39ff
INTERNAL: net/sfc: enforce driver debug
arybchenko Jul 17, 2018
31cfd70
net/failsafe: suggest enabling Rx drop by default
ol-ivanmal May 3, 2020
30ae6c7
INTERNAL: net/virtio: check Xilinx limit on MSS on prepare
ol-andrewr Mar 23, 2021
a1ef17a
INTERNAL: net/virtio: check Xilinx limit on a number of segments
ol-andrewr May 4, 2021
fe6a3c4
app/testpmd: set fixed flag for exact link speed
arybchenko Apr 12, 2019
808f80f
INTERNAL: net/sfc: allow unconfigured NIC
arybchenko Oct 24, 2018
ef30038
app/testpmd: add command-line to set all ports loopback mode
ol-igorrom Oct 23, 2018
e1d3ae5
INTERNAL: net/sfc: DEBUG: log assertion failure on scatter packet
ol-igorrom May 6, 2020
5affd0e
INTERNAL: version: 22.03.0-rc15
ol-andrewr Dec 8, 2017
2de7d0d
vdpa/sfc: handle sync issue between qemu and vhost-user
asaini-xilinx Dec 8, 2021
ee58f63
vdpa/sfc: enable support for multi-queue
asaini-xilinx Dec 8, 2021
29170c9
vdpa/sfc: Decorate memzone name with pciaddr before using
asaini-xilinx Nov 15, 2021
8b8ffd1
common/sfc_efx/base: remove VQ index check during VQ start
asaini-xilinx Feb 4, 2022
e0ab1fd
common/sfc_efx/base: update MCDI headers
asaini-xilinx Jan 5, 2022
50cfbe3
common/sfc_efx/base: use the updated definitions of cidx/pidx
asaini-xilinx Jan 5, 2022
ca1c005
vdpa/sfc: Add support for SW assisted live migration
Jul 14, 2022
15b5511
common/sfc_efx/base: add an API to relocate MCDI IOVA
Jul 17, 2022
0acecd1
common/sfc_efx: add callback to handle DMA remap requests
Jul 17, 2022
c957571
vdpa/sfc: add support for mcdi IOVA remap
Jul 17, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .reviewboardrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
REVIEWBOARD_URL = "https://reviewboard.xilinx.com/"
REPOSITORY = "Xilinx-CNS/cns-dpdk-next-sfc"
REPOSITORY_TYPE = "git"
2 changes: 1 addition & 1 deletion VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
22.03.0-rc0
22.03.0-rc15
14 changes: 7 additions & 7 deletions app/test-pmd/cmdline.c
Original file line number Diff line number Diff line change
Expand Up @@ -1508,19 +1508,19 @@ parse_and_check_speed_duplex(char *speedstr, char *duplexstr, uint32_t *speed)
return -1;
}
if (!strcmp(speedstr, "1000")) {
*speed = RTE_ETH_LINK_SPEED_1G;
*speed = RTE_ETH_LINK_SPEED_1G | RTE_ETH_LINK_SPEED_FIXED;
} else if (!strcmp(speedstr, "10000")) {
*speed = RTE_ETH_LINK_SPEED_10G;
*speed = RTE_ETH_LINK_SPEED_10G | RTE_ETH_LINK_SPEED_FIXED;
} else if (!strcmp(speedstr, "25000")) {
*speed = RTE_ETH_LINK_SPEED_25G;
*speed = RTE_ETH_LINK_SPEED_25G | RTE_ETH_LINK_SPEED_FIXED;
} else if (!strcmp(speedstr, "40000")) {
*speed = RTE_ETH_LINK_SPEED_40G;
*speed = RTE_ETH_LINK_SPEED_40G | RTE_ETH_LINK_SPEED_FIXED;
} else if (!strcmp(speedstr, "50000")) {
*speed = RTE_ETH_LINK_SPEED_50G;
*speed = RTE_ETH_LINK_SPEED_50G | RTE_ETH_LINK_SPEED_FIXED;
} else if (!strcmp(speedstr, "100000")) {
*speed = RTE_ETH_LINK_SPEED_100G;
*speed = RTE_ETH_LINK_SPEED_100G | RTE_ETH_LINK_SPEED_FIXED;
} else if (!strcmp(speedstr, "200000")) {
*speed = RTE_ETH_LINK_SPEED_200G;
*speed = RTE_ETH_LINK_SPEED_200G | RTE_ETH_LINK_SPEED_FIXED;
} else if (!strcmp(speedstr, "auto")) {
*speed = RTE_ETH_LINK_SPEED_AUTONEG;
} else {
Expand Down
18 changes: 18 additions & 0 deletions app/test-pmd/parameters.c
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ usage(char* progname)
printf(" --disable-rss: disable rss.\n");
printf(" --port-topology=<paired|chained|loop>: set port topology (paired "
"is default).\n");
printf(" --loopback-mode=N: set loopback mode for all ports\n");
printf(" --forward-mode=N: set forwarding mode (N: %s).\n",
list_pkt_forwarding_modes());
printf(" --forward-mode=5tswap: set forwarding mode to "
Expand Down Expand Up @@ -645,6 +646,7 @@ launch_args_parse(int argc, char** argv)
{ "enable-drop-en", 0, 0, 0 },
{ "disable-rss", 0, 0, 0 },
{ "port-topology", 1, 0, 0 },
{ "loopback-mode", 1, 0, 0 },
{ "forward-mode", 1, 0, 0 },
{ "rss-ip", 0, 0, 0 },
{ "rss-udp", 0, 0, 0 },
Expand Down Expand Up @@ -1092,6 +1094,22 @@ launch_args_parse(int argc, char** argv)
" must be: paired, chained or loop\n",
optarg);
}
if (!strcmp(lgopts[opt_idx].name, "loopback-mode")) {
char *end = NULL;
unsigned int mode;

errno = 0;
mode = strtoul(optarg, &end, 0);

if (errno != 0 || (optarg[0] == '\0') ||
(end == NULL) || (*end != '\0')) {
rte_exit(EXIT_FAILURE,
"Loopback mode: %s invalid\n",
optarg);
}
RTE_ETH_FOREACH_DEV(pid)
ports[pid].dev_conf.lpbk_mode = mode;
}
if (!strcmp(lgopts[opt_idx].name, "forward-mode"))
set_pkt_forwarding_mode(optarg);
if (!strcmp(lgopts[opt_idx].name, "rss-ip"))
Expand Down
18 changes: 12 additions & 6 deletions drivers/common/sfc_efx/base/efx.h
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,7 @@ typedef struct efx_mcdi_transport_s {
void (*emt_execute)(void *, efx_mcdi_req_t *);
void (*emt_ev_cpl)(void *);
void (*emt_exception)(void *, efx_mcdi_exception_t);
void (*emt_remap)(void *);
#if EFSYS_OPT_MCDI_LOGGING
void (*emt_logger)(void *, efx_log_msg_t,
void *, size_t, void *, size_t);
Expand All @@ -357,6 +358,11 @@ efx_mcdi_init(
__in efx_nic_t *enp,
__in const efx_mcdi_transport_t *mtp);

LIBEFX_API
extern __checkReturn efx_rc_t
efx_mcdi_dma_remap(
__in efx_nic_t *enp);

LIBEFX_API
extern __checkReturn efx_rc_t
efx_mcdi_reboot(
Expand Down Expand Up @@ -4840,17 +4846,17 @@ typedef enum efx_virtio_vq_type_e {

typedef struct efx_virtio_vq_dyncfg_s {
/*
* If queue is being created to be migrated then this
* should be the FINAL_PIDX value returned by MC_CMD_VIRTIO_FINI_QUEUE
* If queue is being created to be migrated then this should be
* the FINAL_AVAIL_IDX value returned by MC_CMD_VIRTIO_FINI_QUEUE
* of the queue being migrated from. Otherwise, it should be zero.
*/
uint32_t evvd_vq_pidx;
uint32_t evvd_vq_avail_idx;
/*
* If this queue is being created to be migrated then this
* should be the FINAL_CIDX value returned by MC_CMD_VIRTIO_FINI_QUEUE
* If queue is being created to be migrated then this should be
* the FINAL_USED_IDX value returned by MC_CMD_VIRTIO_FINI_QUEUE
* of the queue being migrated from. Otherwise, it should be zero.
*/
uint32_t evvd_vq_cidx;
uint32_t evvd_vq_used_idx;
} efx_virtio_vq_dyncfg_t;

/*
Expand Down
56 changes: 55 additions & 1 deletion drivers/common/sfc_efx/base/efx_mcdi.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,49 @@ efx_mcdi_init(
return (rc);
}

void
__checkReturn efx_rc_t
efx_mcdi_dma_remap(
__in efx_nic_t *enp)
{
const efx_mcdi_transport_t *emtp = enp->en_mcdi.em_emtp;
efx_mcdi_iface_t *emip = &(enp->en_mcdi.em_emip);
efx_mcdi_remap_state_t remap_state;
efsys_lock_state_t state;
efx_rc_t rc;

if (emtp->emt_remap == NULL) {
rc = EINVAL;
goto fail1;
}

EFSYS_LOCK(enp->en_eslp, state);
if (emip->emi_pending_req != NULL) {
/*
* In-flight MCDI command detected so delay remapping,
* check emip->emi_remap_state in efx_mcdi_request_start()
* and ensure remapping is done before sending next command
*/
emip->emi_remap_state = EFX_MCDI_DMA_REMAP_STATE_PENDING;
}
remap_state = emip->emi_remap_state;
EFSYS_UNLOCK(enp->en_eslp, state);

/*
* Don't hold the lock while applying the re-mapping because
* emt_remap invokes the client driver, which can in turn invoke
* the common code again and casue a deadlock
*/
if (remap_state == EFX_MCDI_DMA_REMAP_STATE_DEFAULT)
emtp->emt_remap(emtp->emt_context);

return 0;

fail1:
EFSYS_PROBE1(fail1, efx_rc_t, rc);
return (rc);
}

void
efx_mcdi_fini(
__in efx_nic_t *enp)
{
Expand Down Expand Up @@ -255,6 +297,7 @@ efx_mcdi_request_start(
unsigned int xflags;
boolean_t new_epoch;
efsys_lock_state_t state;
efx_mcdi_remap_state_t remap_state;

EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_MCDI);
Expand All @@ -280,8 +323,19 @@ efx_mcdi_request_start(
seq = emip->emi_seq++ & EFX_MASK32(MCDI_HEADER_SEQ);
new_epoch = emip->emi_new_epoch;
max_version = emip->emi_max_version;
if (emip->emi_remap_state == EFX_MCDI_DMA_REMAP_STATE_PENDING)
emip->emi_remap_state = EFX_MCDI_DMA_REMAP_STATE_INPROGRESS;
remap_state = emip->emi_remap_state;
EFSYS_UNLOCK(enp->en_eslp, state);

if (remap_state == EFX_MCDI_DMA_REMAP_STATE_INPROGRESS) {
emtp->emt_remap(emtp->emt_context);

EFSYS_LOCK(enp->en_eslp, state);
emip->emi_remap_state = EFX_MCDI_DMA_REMAP_STATE_DEFAULT;
EFSYS_UNLOCK(enp->en_eslp, state);
}

xflags = 0;
if (ev_cpl)
xflags |= MCDI_HEADER_XFLAGS_EVREQ;
Expand Down
7 changes: 7 additions & 0 deletions drivers/common/sfc_efx/base/efx_mcdi.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ extern "C" {
*/
#define EFX_MCDI_STATUS_SLEEP_US 10000

typedef enum efx_mcdi_remap_state_e {
EFX_MCDI_DMA_REMAP_STATE_DEFAULT,
EFX_MCDI_DMA_REMAP_STATE_PENDING,
EFX_MCDI_DMA_REMAP_STATE_INPROGRESS,
} efx_mcdi_remap_state_t;

struct efx_mcdi_req_s {
boolean_t emr_quiet;
/* Inputs: Command #, input buffer and length */
Expand Down Expand Up @@ -54,6 +60,7 @@ typedef struct efx_mcdi_iface_s {
int emi_aborted;
uint32_t emi_poll_cnt;
uint32_t emi_mc_reboot_status;
efx_mcdi_remap_state_t emi_remap_state;
} efx_mcdi_iface_t;

LIBEFX_INTERNAL
Expand Down
36 changes: 25 additions & 11 deletions drivers/common/sfc_efx/base/efx_regs_mcdi.h
Original file line number Diff line number Diff line change
Expand Up @@ -28071,18 +28071,26 @@
#define MC_CMD_VIRTIO_INIT_QUEUE_REQ_FEATURES_HI_WIDTH 32
/* Enum values, see field(s): */
/* MC_CMD_VIRTIO_GET_FEATURES/MC_CMD_VIRTIO_GET_FEATURES_OUT/FEATURES */
/* The initial producer index for this queue's used ring. If this queue is
* being created to be migrated into, this should be the FINAL_PIDX value
* returned by MC_CMD_VIRTIO_FINI_QUEUE of the queue being migrated from.
* Otherwise, it should be zero.
/* The initial available index for this virtqueue. If this queue is being
* created to be migrated into, this should be the FINAL_AVAIL_IDX value
* returned by MC_CMD_VIRTIO_FINI_QUEUE of the queue being migrated from (or
* equivalent if the original queue was on a thirdparty device). Otherwise, it
* should be zero.
*/
#define MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_AVAIL_IDX_OFST 56
#define MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_AVAIL_IDX_LEN 4
/* Alias of INITIAL_AVAIL_IDX, kept for compatibility. */
#define MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_PIDX_OFST 56
#define MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_PIDX_LEN 4
/* The initial consumer index for this queue's available ring. If this queue is
* being created to be migrated into, this should be the FINAL_CIDX value
* returned by MC_CMD_VIRTIO_FINI_QUEUE of the queue being migrated from.
* Otherwise, it should be zero.
*/
/* The initial used index for this virtqueue. If this queue is being created to
* be migrated into, this should be the FINAL_USED_IDX value returned by
* MC_CMD_VIRTIO_FINI_QUEUE of the queue being migrated from (or equivalent if
* the original queue was on a thirdparty device). Otherwise, it should be
* zero.
*/
#define MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_USED_IDX_OFST 60
#define MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_USED_IDX_LEN 4
/* Alias of INITIAL_USED_IDX, kept for compatibility. */
#define MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_CIDX_OFST 60
#define MC_CMD_VIRTIO_INIT_QUEUE_REQ_INITIAL_CIDX_LEN 4
/* A MAE_MPORT_SELECTOR defining which mport this queue should be associated
Expand Down Expand Up @@ -28128,10 +28136,16 @@

/* MC_CMD_VIRTIO_FINI_QUEUE_RESP msgresponse */
#define MC_CMD_VIRTIO_FINI_QUEUE_RESP_LEN 8
/* The producer index of the used ring when the queue was stopped. */
/* The available index of the virtqueue when the queue was stopped. */
#define MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_AVAIL_IDX_OFST 0
#define MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_AVAIL_IDX_LEN 4
/* Alias of FINAL_AVAIL_IDX, kept for compatibility. */
#define MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_PIDX_OFST 0
#define MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_PIDX_LEN 4
/* The consumer index of the available ring when the queue was stopped. */
/* The used index of the virtqueue when the queue was stopped. */
#define MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_USED_IDX_OFST 4
#define MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_USED_IDX_LEN 4
/* Alias of FINAL_USED_IDX, kept for compatibility. */
#define MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_CIDX_OFST 4
#define MC_CMD_VIRTIO_FINI_QUEUE_RESP_FINAL_CIDX_LEN 4

Expand Down
28 changes: 9 additions & 19 deletions drivers/common/sfc_efx/base/rhead_virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,6 @@ rhead_virtio_qstart(
goto fail2;
}

if (evvdp != NULL) {
if ((evvdp->evvd_vq_cidx > evvcp->evvc_vq_size) ||
(evvdp->evvd_vq_pidx > evvcp->evvc_vq_size)) {
rc = EINVAL;
goto fail3;
}
}

req.emr_cmd = MC_CMD_VIRTIO_INIT_QUEUE;
req.emr_in_buf = payload;
req.emr_in_length = MC_CMD_VIRTIO_INIT_QUEUE_REQ_LEN;
Expand Down Expand Up @@ -103,10 +95,10 @@ rhead_virtio_qstart(
evvcp->evcc_features >> 32);

if (evvdp != NULL) {
MCDI_IN_SET_DWORD(req, VIRTIO_INIT_QUEUE_REQ_INITIAL_PIDX,
evvdp->evvd_vq_pidx);
MCDI_IN_SET_DWORD(req, VIRTIO_INIT_QUEUE_REQ_INITIAL_CIDX,
evvdp->evvd_vq_cidx);
MCDI_IN_SET_DWORD(req, VIRTIO_INIT_QUEUE_REQ_INITIAL_AVAIL_IDX,
evvdp->evvd_vq_avail_idx);
MCDI_IN_SET_DWORD(req, VIRTIO_INIT_QUEUE_REQ_INITIAL_USED_IDX,
evvdp->evvd_vq_used_idx);
}

MCDI_IN_SET_DWORD(req, VIRTIO_INIT_QUEUE_REQ_MPORT_SELECTOR,
Expand All @@ -116,15 +108,13 @@ rhead_virtio_qstart(

if (req.emr_rc != 0) {
rc = req.emr_rc;
goto fail4;
goto fail3;
}

evvp->evv_vi_index = vi_index;

return (0);

fail4:
EFSYS_PROBE(fail4);
fail3:
EFSYS_PROBE(fail3);
fail2:
Expand Down Expand Up @@ -171,10 +161,10 @@ rhead_virtio_qstop(
}

if (evvdp != NULL) {
evvdp->evvd_vq_pidx =
MCDI_OUT_DWORD(req, VIRTIO_FINI_QUEUE_RESP_FINAL_PIDX);
evvdp->evvd_vq_cidx =
MCDI_OUT_DWORD(req, VIRTIO_FINI_QUEUE_RESP_FINAL_CIDX);
evvdp->evvd_vq_avail_idx =
MCDI_OUT_DWORD(req, VIRTIO_FINI_QUEUE_RESP_FINAL_AVAIL_IDX);
evvdp->evvd_vq_used_idx =
MCDI_OUT_DWORD(req, VIRTIO_FINI_QUEUE_RESP_FINAL_USED_IDX);
}

return (0);
Expand Down
2 changes: 1 addition & 1 deletion drivers/common/sfc_efx/efsys.h
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ prefetch_read_once(const volatile void *addr)

#define EFSYS_OPT_LICENSING 0

#define EFSYS_OPT_ALLOW_UNCONFIGURED_NIC 0
#define EFSYS_OPT_ALLOW_UNCONFIGURED_NIC 1

#define EFSYS_OPT_RX_PACKED_STREAM 0

Expand Down
2 changes: 2 additions & 0 deletions drivers/common/sfc_efx/sfc_efx_debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

#include <rte_debug.h>

#define RTE_DEBUG_COMMON_SFC_EFX 1

#ifndef RTE_DEBUG_COMMON_SFC_EFX
#define RTE_DEBUG_COMMON_SFC_EFX 0
#endif
Expand Down
25 changes: 25 additions & 0 deletions drivers/common/sfc_efx/sfc_efx_mcdi.c
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,30 @@ sfc_efx_mcdi_ev_proxy_response(void *arg, uint32_t handle, efx_rc_t result)
mcdi->proxy_result = result;
}

static void
sfc_efx_mcdi_dma_remap(void *arg)
{
struct sfc_efx_mcdi *mcdi = (struct sfc_efx_mcdi *)arg;
efx_mcdi_transport_t *emtp;
int rc;

rte_spinlock_lock(&mcdi->lock);

emtp = &mcdi->transport;
rc = mcdi->ops->dma_remap(mcdi->ops_cookie, &mcdi->mem);
if (rc != 0)
goto fail_dma_alloc;

emtp->emt_dma_mem = &mcdi->mem;

rte_spinlock_unlock(&mcdi->lock);
return;

fail_dma_alloc:
mcdi->state = SFC_EFX_MCDI_DEAD;
rte_spinlock_unlock(&mcdi->lock);
}

int
sfc_efx_mcdi_init(struct sfc_efx_mcdi *mcdi,
uint32_t logtype, const char *log_prefix, efx_nic_t *nic,
Expand Down Expand Up @@ -303,6 +327,7 @@ sfc_efx_mcdi_init(struct sfc_efx_mcdi *mcdi,
emtp->emt_exception = sfc_efx_mcdi_exception;
emtp->emt_logger = sfc_efx_mcdi_logger;
emtp->emt_ev_proxy_response = sfc_efx_mcdi_ev_proxy_response;
emtp->emt_remap = sfc_efx_mcdi_dma_remap;

sfc_efx_mcdi_info(mcdi, "init MCDI");
rc = efx_mcdi_init(mcdi->nic, emtp);
Expand Down
Loading