The branch main has been updated by mjg:

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

commit 907257d6967dd23506e69042c55bb1edc983c0ba
Author:     Mateusz Guzik <m...@freebsd.org>
AuthorDate: 2021-07-19 12:40:25 +0000
Commit:     Mateusz Guzik <m...@freebsd.org>
CommitDate: 2021-07-20 16:11:31 +0000

    pf: embed a pointer to the lock in struct pf_kstate
    
    This shaves calculation which in particular helps on arm.
    
    Note using the & hack instead would still be more work.
    
    Reviewed by:    kp
    Sponsored by:   Rubicon Communications, LLC ("Netgate")
---
 sys/net/pfvar.h     | 23 +++++++++++++++++------
 sys/netpfil/pf/pf.c |  3 +++
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/sys/net/pfvar.h b/sys/net/pfvar.h
index 35f906a8cbb2..70fde0aa7380 100644
--- a/sys/net/pfvar.h
+++ b/sys/net/pfvar.h
@@ -99,22 +99,32 @@ struct pfi_dynaddr {
 #define        PF_HASHROW_LOCK(h)      mtx_lock(&(h)->lock)
 #define        PF_HASHROW_UNLOCK(h)    mtx_unlock(&(h)->lock)
 
+#ifdef INVARIANTS
 #define        PF_STATE_LOCK(s)                                                
\
        do {                                                            \
-               struct pf_idhash *_ih = &V_pf_idhash[PF_IDHASH(s)];     \
-               PF_HASHROW_LOCK(_ih);                                   \
+               struct pf_kstate *_s = (s);                             \
+               struct pf_idhash *_ih = &V_pf_idhash[PF_IDHASH(_s)];    \
+               MPASS(_s->lock == &_ih->lock);                          \
+               mtx_lock(_s->lock);                                     \
        } while (0)
-
 #define        PF_STATE_UNLOCK(s)                                              
\
        do {                                                            \
-               struct pf_idhash *_ih = &V_pf_idhash[PF_IDHASH((s))];   \
-               PF_HASHROW_UNLOCK(_ih);                                 \
+               struct pf_kstate *_s = (s);                             \
+               struct pf_idhash *_ih = &V_pf_idhash[PF_IDHASH(_s)];    \
+               MPASS(_s->lock == &_ih->lock);                          \
+               mtx_unlock(_s->lock);                                   \
        } while (0)
+#else
+#define        PF_STATE_LOCK(s)        mtx_lock(s->lock)
+#define        PF_STATE_UNLOCK(s)      mtx_unlock(s->lock)
+#endif
 
 #ifdef INVARIANTS
 #define        PF_STATE_LOCK_ASSERT(s)                                         
\
        do {                                                            \
-               struct pf_idhash *_ih = &V_pf_idhash[PF_IDHASH(s)];     \
+               struct pf_kstate *_s = (s);                             \
+               struct pf_idhash *_ih = &V_pf_idhash[PF_IDHASH(_s)];    \
+               MPASS(_s->lock == &_ih->lock);                          \
                PF_HASHROW_ASSERT(_ih);                                 \
        } while (0)
 #else /* !INVARIANTS */
@@ -602,6 +612,7 @@ struct pf_kstate {
        u_int8_t                 sync_state; /* PFSYNC_S_x */
        u_int8_t                 sync_updates; /* XXX */
        u_int                    refs;
+       struct mtx              *lock;
        TAILQ_ENTRY(pf_kstate)   sync_list;
        TAILQ_ENTRY(pf_kstate)   key_list[2];
        LIST_ENTRY(pf_kstate)    entry;
diff --git a/sys/netpfil/pf/pf.c b/sys/netpfil/pf/pf.c
index 6fdeab517792..4729e7a5c19f 100644
--- a/sys/netpfil/pf/pf.c
+++ b/sys/netpfil/pf/pf.c
@@ -1045,6 +1045,9 @@ pf_state_key_attach(struct pf_state_key *skw, struct 
pf_state_key *sks,
        kh = khw;
        idx = PF_SK_WIRE;
 
+       MPASS(s->lock == NULL);
+       s->lock = &V_pf_idhash[PF_IDHASH(s)].lock;
+
 keyattach:
        LIST_FOREACH(cur, &kh->keys, entry)
                if (bcmp(cur, sk, sizeof(struct pf_state_key_cmp)) == 0)
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to