aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/netmap
diff options
context:
space:
mode:
authorVincenzo Maffione <vmaffione@FreeBSD.org>2019-03-18 12:22:23 +0000
committerVincenzo Maffione <vmaffione@FreeBSD.org>2019-03-18 12:22:23 +0000
commitd12354a56c82993a353903ada310952bda231409 (patch)
tree132a50d4b2cdd32fcdf7c093c52cbbb3127bc685 /sys/dev/netmap
parent5c04f73e07b97ba421d072b7679e8ef477b8babc (diff)
Notes
Diffstat (limited to 'sys/dev/netmap')
-rw-r--r--sys/dev/netmap/netmap.c42
-rw-r--r--sys/dev/netmap/netmap_legacy.c8
-rw-r--r--sys/dev/netmap/netmap_mem2.c4
3 files changed, 52 insertions, 2 deletions
diff --git a/sys/dev/netmap/netmap.c b/sys/dev/netmap/netmap.c
index be7e636ae04cd..43b383496a2e2 100644
--- a/sys/dev/netmap/netmap.c
+++ b/sys/dev/netmap/netmap.c
@@ -1035,6 +1035,10 @@ netmap_do_unregif(struct netmap_priv_d *priv)
}
na->nm_krings_delete(na);
+
+ /* restore the default number of host tx and rx rings */
+ na->num_host_tx_rings = 1;
+ na->num_host_rx_rings = 1;
}
/* possibily decrement counter of tx_si/rx_si users */
@@ -1575,6 +1579,19 @@ netmap_get_na(struct nmreq_header *hdr,
*na = ret;
netmap_adapter_get(ret);
+ /*
+ * if the adapter supports the host rings and it is not alread open,
+ * try to set the number of host rings as requested by the user
+ */
+ if (((*na)->na_flags & NAF_HOST_RINGS) && (*na)->active_fds == 0) {
+ if (req->nr_host_tx_rings)
+ (*na)->num_host_tx_rings = req->nr_host_tx_rings;
+ if (req->nr_host_rx_rings)
+ (*na)->num_host_rx_rings = req->nr_host_rx_rings;
+ }
+ nm_prdis("%s: host tx %d rx %u", (*na)->name, (*na)->num_host_tx_rings,
+ (*na)->num_host_rx_rings);
+
out:
if (error) {
if (ret)
@@ -1856,6 +1873,25 @@ netmap_interp_ringid(struct netmap_priv_d *priv, uint32_t nr_mode,
nm_prdis("ONE_NIC: %s %d %d", nm_txrx2str(t),
priv->np_qfirst[t], priv->np_qlast[t]);
break;
+ case NR_REG_ONE_SW:
+ if (!(na->na_flags & NAF_HOST_RINGS)) {
+ nm_prerr("host rings not supported");
+ return EINVAL;
+ }
+ if (nr_ringid >= na->num_host_tx_rings &&
+ nr_ringid >= na->num_host_rx_rings) {
+ nm_prerr("invalid ring id %d", nr_ringid);
+ return EINVAL;
+ }
+ /* if not enough rings, use the first one */
+ j = nr_ringid;
+ if (j >= nma_get_host_nrings(na, t))
+ j = 0;
+ priv->np_qfirst[t] = nma_get_nrings(na, t) + j;
+ priv->np_qlast[t] = nma_get_nrings(na, t) + j + 1;
+ nm_prdis("ONE_SW: %s %d %d", nm_txrx2str(t),
+ priv->np_qfirst[t], priv->np_qlast[t]);
+ break;
default:
nm_prerr("invalid regif type %d", nr_mode);
return EINVAL;
@@ -2546,6 +2582,8 @@ netmap_ioctl(struct netmap_priv_d *priv, u_long cmd, caddr_t data,
req->nr_tx_rings = na->num_tx_rings;
req->nr_rx_slots = na->num_rx_desc;
req->nr_tx_slots = na->num_tx_desc;
+ req->nr_host_tx_rings = na->num_host_tx_rings;
+ req->nr_host_rx_rings = na->num_host_rx_rings;
error = netmap_mem_get_info(na->nm_mem, &req->nr_memsize, &memflags,
&req->nr_mem_id);
if (error) {
@@ -2610,6 +2648,8 @@ netmap_ioctl(struct netmap_priv_d *priv, u_long cmd, caddr_t data,
regreq.nr_rx_slots = req->nr_rx_slots;
regreq.nr_tx_rings = req->nr_tx_rings;
regreq.nr_rx_rings = req->nr_rx_rings;
+ regreq.nr_host_tx_rings = req->nr_host_tx_rings;
+ regreq.nr_host_rx_rings = req->nr_host_rx_rings;
regreq.nr_mem_id = req->nr_mem_id;
/* get a refcount */
@@ -2647,6 +2687,8 @@ netmap_ioctl(struct netmap_priv_d *priv, u_long cmd, caddr_t data,
req->nr_tx_rings = na->num_tx_rings;
req->nr_rx_slots = na->num_rx_desc;
req->nr_tx_slots = na->num_tx_desc;
+ req->nr_host_tx_rings = na->num_host_tx_rings;
+ req->nr_host_rx_rings = na->num_host_rx_rings;
} while (0);
netmap_unget_na(na, ifp);
NMG_UNLOCK();
diff --git a/sys/dev/netmap/netmap_legacy.c b/sys/dev/netmap/netmap_legacy.c
index afbd5ced8510e..dd875c80e6aa7 100644
--- a/sys/dev/netmap/netmap_legacy.c
+++ b/sys/dev/netmap/netmap_legacy.c
@@ -68,6 +68,8 @@ nmreq_register_from_legacy(struct nmreq *nmr, struct nmreq_header *hdr,
req->nr_rx_slots = nmr->nr_rx_slots;
req->nr_tx_rings = nmr->nr_tx_rings;
req->nr_rx_rings = nmr->nr_rx_rings;
+ req->nr_host_tx_rings = 0;
+ req->nr_host_rx_rings = 0;
req->nr_mem_id = nmr->nr_arg2;
req->nr_ringid = nmr->nr_ringid & NETMAP_RING_MASK;
if ((nmr->nr_flags & NR_REG_MASK) == NR_REG_DEFAULT) {
@@ -249,6 +251,8 @@ nmreq_from_legacy(struct nmreq *nmr, u_long ioctl_cmd)
req->nr_rx_slots = nmr->nr_rx_slots;
req->nr_tx_rings = nmr->nr_tx_rings;
req->nr_rx_rings = nmr->nr_rx_rings;
+ req->nr_host_tx_rings = 0;
+ req->nr_host_rx_rings = 0;
req->nr_mem_id = nmr->nr_arg2;
}
break;
@@ -367,8 +371,8 @@ netmap_ioctl_legacy(struct netmap_priv_d *priv, u_long cmd, caddr_t data,
struct nmreq *nmr = (struct nmreq *) data;
struct nmreq_header *hdr;
- if (nmr->nr_version < 11) {
- nm_prerr("Minimum supported API is 11 (requested %u)",
+ if (nmr->nr_version < 14) {
+ nm_prerr("Minimum supported API is 14 (requested %u)",
nmr->nr_version);
return EINVAL;
}
diff --git a/sys/dev/netmap/netmap_mem2.c b/sys/dev/netmap/netmap_mem2.c
index 8aa7e3f46409a..fc0b62d2abff5 100644
--- a/sys/dev/netmap/netmap_mem2.c
+++ b/sys/dev/netmap/netmap_mem2.c
@@ -2012,6 +2012,10 @@ netmap_mem2_if_new(struct netmap_adapter *na, struct netmap_priv_d *priv)
/* initialize base fields -- override const */
*(u_int *)(uintptr_t)&nifp->ni_tx_rings = na->num_tx_rings;
*(u_int *)(uintptr_t)&nifp->ni_rx_rings = na->num_rx_rings;
+ *(u_int *)(uintptr_t)&nifp->ni_host_tx_rings =
+ (na->num_host_tx_rings ? na->num_host_tx_rings : 1);
+ *(u_int *)(uintptr_t)&nifp->ni_host_rx_rings =
+ (na->num_host_rx_rings ? na->num_host_rx_rings : 1);
strlcpy(nifp->ni_name, na->name, sizeof(nifp->ni_name));
/*