svn commit: r346632 - head/sys/net

2019-09-03 Thread Andrew Gallatin
Author: gallatin
Date: Wed Apr 24 13:32:04 2019
New Revision: 346632
URL: https://svnweb.freebsd.org/changeset/base/346632

Log:
  iflib: Add pfil hooks
  
  As with mlx5en, the idea is to drop unwanted traffic as early
  in receive as possible, before mbufs are allocated and anything
  is passed up the stack.  This can save considerable CPU time
  when a machine is under a flooding style DOS attack.
  
  The major change here is to remove the unneeded abstraction where
  callers of rxd_frag_to_sd() get back a pointer to the mbuf ring, and
  are responsible for NULL'ing that mbuf themselves. Now this happens
  directly in rxd_frag_to_sd(), and it returns an mbuf. This allows us
  to use the decision (and potentially mbuf) returned by the pfil
  hooks. The driver can now recycle mbufs to avoid re-allocation when
  packets are dropped.
  
  Reviewed by:  marius  (shurd and erj also provided feedback)
  Sponsored by: Netflix
  Differential Revision:https://reviews.freebsd.org/D19645

Modified:
  head/sys/net/iflib.c

Modified: head/sys/net/iflib.c
==
--- head/sys/net/iflib.cWed Apr 24 13:15:56 2019(r346631)
+++ head/sys/net/iflib.cWed Apr 24 13:32:04 2019(r346632)
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include 
@@ -432,6 +433,7 @@ struct iflib_rxq {
if_ctx_tifr_ctx;
iflib_fl_t  ifr_fl;
uint64_tifr_rx_irq;
+   struct pfil_head*pfil;
uint16_tifr_id;
uint8_t ifr_lro_enabled;
uint8_t ifr_nfl;
@@ -451,7 +453,6 @@ struct iflib_rxq {
 
 typedef struct if_rxsd {
caddr_t *ifsd_cl;
-   struct mbuf **ifsd_m;
iflib_fl_t ifsd_fl;
qidx_t ifsd_cidx;
 } *if_rxsd_t;
@@ -652,7 +653,6 @@ static int iflib_fast_intrs;
 static int iflib_rx_unavail;
 static int iflib_rx_ctx_inactive;
 static int iflib_rx_if_input;
-static int iflib_rx_mbuf_null;
 static int iflib_rxd_flush;
 
 static int iflib_verbose_debug;
@@ -669,8 +669,6 @@ SYSCTL_INT(_net_iflib, OID_AUTO, rx_ctx_inactive, CTLF
   _rx_ctx_inactive, 0, "# times rxeof called with 
inactive context");
 SYSCTL_INT(_net_iflib, OID_AUTO, rx_if_input, CTLFLAG_RD,
   _rx_if_input, 0, "# times rxeof called if_input");
-SYSCTL_INT(_net_iflib, OID_AUTO, rx_mbuf_null, CTLFLAG_RD,
-  _rx_mbuf_null, 0, "# times rxeof got null mbuf");
 SYSCTL_INT(_net_iflib, OID_AUTO, rxd_flush, CTLFLAG_RD,
 _rxd_flush, 0, "# times rxd_flush called");
 SYSCTL_INT(_net_iflib, OID_AUTO, verbose_debug, CTLFLAG_RW,
@@ -689,7 +687,7 @@ iflib_debug_reset(void)
iflib_task_fn_rxs = iflib_rx_intr_enables = iflib_fast_intrs =
iflib_rx_unavail =
iflib_rx_ctx_inactive = iflib_rx_if_input =
-   iflib_rx_mbuf_null = iflib_rxd_flush = 0;
+   iflib_rxd_flush = 0;
 }
 
 #else
@@ -2002,11 +2000,12 @@ _iflib_fl_refill(if_ctx_t ctx, iflib_fl_t fl, int coun
bus_dmamap_sync(fl->ifl_buf_tag, sd_map[frag_idx],
BUS_DMASYNC_PREREAD);
 
-   MPASS(sd_m[frag_idx] == NULL);
-   if ((m = m_gethdr(M_NOWAIT, MT_NOINIT)) == NULL) {
-   break;
+   if (sd_m[frag_idx] == NULL) {
+   if ((m = m_gethdr(M_NOWAIT, MT_NOINIT)) == NULL) {
+   break;
+   }
+   sd_m[frag_idx] = m;
}
-   sd_m[frag_idx] = m;
bit_set(fl->ifl_rx_bitmap, frag_idx);
 #if MEMORY_LOGGING
fl->ifl_m_enqueued++;
@@ -2483,13 +2482,15 @@ prefetch_pkts(iflib_fl_t fl, int cidx)
prefetch(fl->ifl_sds.ifsd_cl[(cidx + 4) & (nrxd-1)]);
 }
 
-static void
-rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, int unload, if_rxsd_t sd)
+static struct mbuf *
+rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, bool unload, if_rxsd_t sd,
+int *pf_rv, if_rxd_info_t ri)
 {
-   int flid, cidx;
bus_dmamap_t map;
iflib_fl_t fl;
-   int next;
+   caddr_t payload;
+   struct mbuf *m;
+   int flid, cidx, len, next;
 
map = NULL;
flid = irf->irf_flid;
@@ -2497,7 +2498,7 @@ rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, int
fl = >ifr_fl[flid];
sd->ifsd_fl = fl;
sd->ifsd_cidx = cidx;
-   sd->ifsd_m = >ifl_sds.ifsd_m[cidx];
+   m = fl->ifl_sds.ifsd_m[cidx];
sd->ifsd_cl = >ifl_sds.ifsd_cl[cidx];
fl->ifl_credits--;
 #if MEMORY_LOGGING
@@ -2513,39 +2514,89 @@ rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, int
/* not valid assert if bxe really does SGE from non-contiguous elements 
*/
MPASS(fl->ifl_cidx == cidx);
bus_dmamap_sync(fl->ifl_buf_tag, map, BUS_DMASYNC_POSTREAD);
+
+   if (rxq->pfil != 

svn commit: r346632 - head/sys/net

2019-04-24 Thread Andrew Gallatin
Author: gallatin
Date: Wed Apr 24 13:32:04 2019
New Revision: 346632
URL: https://svnweb.freebsd.org/changeset/base/346632

Log:
  iflib: Add pfil hooks
  
  As with mlx5en, the idea is to drop unwanted traffic as early
  in receive as possible, before mbufs are allocated and anything
  is passed up the stack.  This can save considerable CPU time
  when a machine is under a flooding style DOS attack.
  
  The major change here is to remove the unneeded abstraction where
  callers of rxd_frag_to_sd() get back a pointer to the mbuf ring, and
  are responsible for NULL'ing that mbuf themselves. Now this happens
  directly in rxd_frag_to_sd(), and it returns an mbuf. This allows us
  to use the decision (and potentially mbuf) returned by the pfil
  hooks. The driver can now recycle mbufs to avoid re-allocation when
  packets are dropped.
  
  Reviewed by:  marius  (shurd and erj also provided feedback)
  Sponsored by: Netflix
  Differential Revision:https://reviews.freebsd.org/D19645

Modified:
  head/sys/net/iflib.c

Modified: head/sys/net/iflib.c
==
--- head/sys/net/iflib.cWed Apr 24 13:15:56 2019(r346631)
+++ head/sys/net/iflib.cWed Apr 24 13:32:04 2019(r346632)
@@ -59,6 +59,7 @@ __FBSDID("$FreeBSD$");
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include 
@@ -432,6 +433,7 @@ struct iflib_rxq {
if_ctx_tifr_ctx;
iflib_fl_t  ifr_fl;
uint64_tifr_rx_irq;
+   struct pfil_head*pfil;
uint16_tifr_id;
uint8_t ifr_lro_enabled;
uint8_t ifr_nfl;
@@ -451,7 +453,6 @@ struct iflib_rxq {
 
 typedef struct if_rxsd {
caddr_t *ifsd_cl;
-   struct mbuf **ifsd_m;
iflib_fl_t ifsd_fl;
qidx_t ifsd_cidx;
 } *if_rxsd_t;
@@ -652,7 +653,6 @@ static int iflib_fast_intrs;
 static int iflib_rx_unavail;
 static int iflib_rx_ctx_inactive;
 static int iflib_rx_if_input;
-static int iflib_rx_mbuf_null;
 static int iflib_rxd_flush;
 
 static int iflib_verbose_debug;
@@ -669,8 +669,6 @@ SYSCTL_INT(_net_iflib, OID_AUTO, rx_ctx_inactive, CTLF
   _rx_ctx_inactive, 0, "# times rxeof called with 
inactive context");
 SYSCTL_INT(_net_iflib, OID_AUTO, rx_if_input, CTLFLAG_RD,
   _rx_if_input, 0, "# times rxeof called if_input");
-SYSCTL_INT(_net_iflib, OID_AUTO, rx_mbuf_null, CTLFLAG_RD,
-  _rx_mbuf_null, 0, "# times rxeof got null mbuf");
 SYSCTL_INT(_net_iflib, OID_AUTO, rxd_flush, CTLFLAG_RD,
 _rxd_flush, 0, "# times rxd_flush called");
 SYSCTL_INT(_net_iflib, OID_AUTO, verbose_debug, CTLFLAG_RW,
@@ -689,7 +687,7 @@ iflib_debug_reset(void)
iflib_task_fn_rxs = iflib_rx_intr_enables = iflib_fast_intrs =
iflib_rx_unavail =
iflib_rx_ctx_inactive = iflib_rx_if_input =
-   iflib_rx_mbuf_null = iflib_rxd_flush = 0;
+   iflib_rxd_flush = 0;
 }
 
 #else
@@ -2002,11 +2000,12 @@ _iflib_fl_refill(if_ctx_t ctx, iflib_fl_t fl, int coun
bus_dmamap_sync(fl->ifl_buf_tag, sd_map[frag_idx],
BUS_DMASYNC_PREREAD);
 
-   MPASS(sd_m[frag_idx] == NULL);
-   if ((m = m_gethdr(M_NOWAIT, MT_NOINIT)) == NULL) {
-   break;
+   if (sd_m[frag_idx] == NULL) {
+   if ((m = m_gethdr(M_NOWAIT, MT_NOINIT)) == NULL) {
+   break;
+   }
+   sd_m[frag_idx] = m;
}
-   sd_m[frag_idx] = m;
bit_set(fl->ifl_rx_bitmap, frag_idx);
 #if MEMORY_LOGGING
fl->ifl_m_enqueued++;
@@ -2483,13 +2482,15 @@ prefetch_pkts(iflib_fl_t fl, int cidx)
prefetch(fl->ifl_sds.ifsd_cl[(cidx + 4) & (nrxd-1)]);
 }
 
-static void
-rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, int unload, if_rxsd_t sd)
+static struct mbuf *
+rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, bool unload, if_rxsd_t sd,
+int *pf_rv, if_rxd_info_t ri)
 {
-   int flid, cidx;
bus_dmamap_t map;
iflib_fl_t fl;
-   int next;
+   caddr_t payload;
+   struct mbuf *m;
+   int flid, cidx, len, next;
 
map = NULL;
flid = irf->irf_flid;
@@ -2497,7 +2498,7 @@ rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, int
fl = >ifr_fl[flid];
sd->ifsd_fl = fl;
sd->ifsd_cidx = cidx;
-   sd->ifsd_m = >ifl_sds.ifsd_m[cidx];
+   m = fl->ifl_sds.ifsd_m[cidx];
sd->ifsd_cl = >ifl_sds.ifsd_cl[cidx];
fl->ifl_credits--;
 #if MEMORY_LOGGING
@@ -2513,39 +2514,89 @@ rxd_frag_to_sd(iflib_rxq_t rxq, if_rxd_frag_t irf, int
/* not valid assert if bxe really does SGE from non-contiguous elements 
*/
MPASS(fl->ifl_cidx == cidx);
bus_dmamap_sync(fl->ifl_buf_tag, map, BUS_DMASYNC_POSTREAD);
+
+   if (rxq->pfil !=