The branch stable/14 has been updated by kp:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=c1f3f795d80dab4d0ab1ea213252a96735d99a24

commit c1f3f795d80dab4d0ab1ea213252a96735d99a24
Author:     Kristof Provost <k...@freebsd.org>
AuthorDate: 2023-11-09 12:39:56 +0000
Commit:     Kristof Provost <k...@freebsd.org>
CommitDate: 2023-11-16 08:39:45 +0000

    pf: add hashtable row count SDT
    
    This allows us to figure out how many states each hashrow contains. That
    can be important to know when debugging performance issues.
    
    A simple probe could be:
    
            dtrace -n 'pf:purge:state:rowcount { @counts["states per row"] = 
quantize(arg1); }'
            dtrace: description 'pf:purge:state:rowcount ' matched 1 probe
            ^C
    
              states per row
                       value  ------------- Distribution ------------- count
                          -1 |                                         0
                           0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8257624
                           1 |                                         14321
                           2 |                                         0
    
    MFC after:      1 week
    Sponsored by:   Modirum MDPay
    
    (cherry picked from commit 0d2ab4a4ced0f153a6b6a58ca3cfa6efbeeec7a2)
---
 sys/netpfil/pf/pf.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c
index 4990dce653b1..d5a9583d83f8 100644
--- a/sys/netpfil/pf/pf.c
+++ b/sys/netpfil/pf/pf.c
@@ -137,6 +137,7 @@ SDT_PROBE_DEFINE3(pf, eth, test_rule, mismatch,
 SDT_PROBE_DEFINE2(pf, eth, test_rule, match, "int", "struct pf_keth_rule *");
 SDT_PROBE_DEFINE2(pf, eth, test_rule, final_match,
     "int", "struct pf_keth_rule *");
+SDT_PROBE_DEFINE2(pf, purge, state, rowcount, "int", "size_t");
 
 /*
  * Global variables
@@ -2174,6 +2175,7 @@ pf_purge_expired_states(u_int i, int maxcheck)
        struct pf_idhash *ih;
        struct pf_kstate *s;
        struct pf_krule_item *mrm;
+       size_t count;
 
        V_pf_status.states = uma_zone_get_cur(V_pf_state_z);
 
@@ -2181,6 +2183,7 @@ pf_purge_expired_states(u_int i, int maxcheck)
         * Go through hash and unlink states that expire now.
         */
        while (maxcheck > 0) {
+               count = 0;
                ih = &V_pf_idhash[i];
 
                /* only take the lock if we expect to do work */
@@ -2203,10 +2206,13 @@ relock:
                                        mrm->r->rule_ref |= PFRULE_REFS;
                                if (s->rt_kif)
                                        s->rt_kif->pfik_flags |= PFI_IFLAG_REFS;
+                               count++;
                        }
                        PF_HASHROW_UNLOCK(ih);
                }
 
+               SDT_PROBE2(pf, purge, state, rowcount, i, count);
+
                /* Return when we hit end of hash. */
                if (++i > pf_hashmask) {
                        V_pf_status.states = uma_zone_get_cur(V_pf_state_z);

Reply via email to