Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F150553062
D19063.id53689.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D19063.id53689.diff
View Options
Index: sys/dev/mlx5/mlx5_en/en.h
===================================================================
--- sys/dev/mlx5/mlx5_en/en.h
+++ sys/dev/mlx5/mlx5_en/en.h
@@ -48,6 +48,7 @@
#include <netinet/tcp_lro.h>
#include <netinet/udp.h>
#include <net/ethernet.h>
+#include <net/pfil.h>
#include <sys/buf_ring.h>
#include <sys/kthread.h>
@@ -838,6 +839,7 @@
struct mlx5e_clbr_point clbr_points[2];
u_int clbr_gen;
+ struct pfil_head *pfil;
struct mlx5e_channel channel[];
};
Index: sys/dev/mlx5/mlx5_en/mlx5_en_main.c
===================================================================
--- sys/dev/mlx5/mlx5_en/mlx5_en_main.c
+++ sys/dev/mlx5/mlx5_en/mlx5_en_main.c
@@ -3664,6 +3664,7 @@
struct sysctl_oid_list *child;
int ncv = mdev->priv.eq_table.num_comp_vectors;
char unit[16];
+ struct pfil_head_args pa;
int err;
int i;
u32 eth_proto_cap;
@@ -3898,6 +3899,12 @@
callout_init(&priv->tstmp_clbr, CALLOUT_DIRECT);
mlx5e_reset_calibration_callout(priv);
+ pa.pa_version = PFIL_VERSION;
+ pa.pa_flags = PFIL_IN;
+ pa.pa_type = PFIL_TYPE_ETHERNET;
+ pa.pa_headname = ifp->if_xname;
+ priv->pfil = pfil_head_register(&pa);
+
return (priv);
#ifdef RATELIMIT
@@ -3940,6 +3947,12 @@
/* XXX wait a bit to allow IOCTL handlers to complete */
pause("W", hz);
+ /* deregister pfil */
+ if (priv->pfil != NULL) {
+ pfil_head_unregister(priv->pfil);
+ priv->pfil = NULL;
+ }
+
#ifdef RATELIMIT
/*
* The kernel can have reference(s) via the m_snd_tag's into
Index: sys/dev/mlx5/mlx5_en/mlx5_en_rx.c
===================================================================
--- sys/dev/mlx5/mlx5_en/mlx5_en_rx.c
+++ sys/dev/mlx5/mlx5_en/mlx5_en_rx.c
@@ -430,15 +430,16 @@
static int
mlx5e_poll_rx_cq(struct mlx5e_rq *rq, int budget)
{
- int i;
+ int i, rv;
+ CURVNET_SET_QUIET(rq->ifp->if_vnet);
for (i = 0; i < budget; i++) {
struct mlx5e_rx_wqe *wqe;
struct mlx5_cqe64 *cqe;
struct mbuf *mb;
__be16 wqe_counter_be;
u16 wqe_counter;
- u32 byte_cnt;
+ u32 byte_cnt, seglen;
cqe = mlx5e_get_cqe(&rq->cq);
if (!cqe)
@@ -462,6 +463,42 @@
rq->stats.wqe_err++;
goto wq_ll_pop;
}
+ if (PFIL_HOOKED_IN(rq->channel->priv->pfil)) {
+ seglen = MIN(byte_cnt, MLX5E_MAX_RX_BYTES);
+ rv = pfil_run_hooks(rq->channel->priv->pfil,
+ rq->mbuf[wqe_counter].data, rq->ifp,
+ seglen | PFIL_MEMPTR | PFIL_IN, NULL);
+
+ switch (rv) {
+ case PFIL_DROPPED:
+ case PFIL_CONSUMED:
+ /*
+ * Filter dropped or consumed it. In
+ * either case, we can just recycle
+ * buffer; there is no more work to do.
+ */
+ rq->stats.packets++;
+ goto wq_ll_pop;
+ break;
+ case PFIL_REALLOCED:
+ /*
+ * Filter copied it; recycle buffer
+ * and receive the new mbuf allocated
+ * by the Filter
+ */
+ mb = *(struct mbuf **)
+ rq->mbuf[wqe_counter].data;
+ goto rx_common;
+ break;
+ default:
+ /*
+ * The Filter said it was OK, so
+ * receive like normal.
+ */
+ KASSERT(rv == PFIL_PASS,
+ ("Filter returned %d!\n", rv));
+ }
+ }
if ((MHLEN - MLX5E_NET_IP_ALIGN) >= byte_cnt &&
(mb = m_gethdr(M_NOWAIT, MT_DATA)) != NULL) {
#if (MLX5E_MAX_RX_SEGS != 1)
@@ -480,7 +517,7 @@
bus_dmamap_unload(rq->dma_tag,
rq->mbuf[wqe_counter].dma_map);
}
-
+rx_common:
mlx5e_build_rx_mbuf(cqe, rq, mb, byte_cnt);
rq->stats.bytes += byte_cnt;
rq->stats.packets++;
@@ -499,6 +536,7 @@
mlx5_wq_ll_pop(&rq->wq, wqe_counter_be,
&wqe->next.next_wqe_index);
}
+ CURVNET_RESTORE();
mlx5_cqwq_update_db_record(&rq->cq.wq);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Apr 3, 7:19 AM (17 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30740415
Default Alt Text
D19063.id53689.diff (3 KB)
Attached To
Mode
D19063: mlx5en: add pfil ethernet hook
Attached
Detach File
Event Timeline
Log In to Comment