Author: glebius
Date: Sat May  2 22:56:22 2020
New Revision: 360572
URL: https://svnweb.freebsd.org/changeset/base/360572

Log:
  Get rid of the mbuf self-pointing pointer.
  
  Reviewed by:  gallatin
  Differential Revision:        https://reviews.freebsd.org/D24598

Modified:
  head/sys/kern/uipc_ktls.c
  head/sys/sys/mbuf.h

Modified: head/sys/kern/uipc_ktls.c
==============================================================================
--- head/sys/kern/uipc_ktls.c   Sat May  2 22:49:14 2020        (r360571)
+++ head/sys/kern/uipc_ktls.c   Sat May  2 22:56:22 2020        (r360572)
@@ -1436,7 +1436,7 @@ ktls_enqueue_to_free(struct mbuf_ext_pgs *pgs)
        bool running;
 
        /* Mark it for freeing. */
-       pgs->mbuf = NULL;
+       pgs->flags |= EPG_FLAG_2FREE;
        wq = &ktls_wq[pgs->tls->wq_index];
        mtx_lock(&wq->mtx);
        STAILQ_INSERT_TAIL(&wq->head, pgs, stailq);
@@ -1463,7 +1463,6 @@ ktls_enqueue(struct mbuf *m, struct socket *so, int pa
        KASSERT(pgs->tls->mode == TCP_TLS_MODE_SW, ("!SW TLS mbuf"));
 
        pgs->enc_cnt = page_count;
-       pgs->mbuf = m;
 
        /*
         * Save a pointer to the socket.  The caller is responsible
@@ -1496,12 +1495,11 @@ ktls_encrypt(struct mbuf_ext_pgs *pgs)
 
        so = pgs->so;
        tls = pgs->tls;
-       top = pgs->mbuf;
+       top = __containerof(pgs, struct mbuf, m_ext_pgs);
        KASSERT(tls != NULL, ("tls = NULL, top = %p, pgs = %p\n", top, pgs));
        KASSERT(so != NULL, ("so = NULL, top = %p, pgs = %p\n", top, pgs));
 #ifdef INVARIANTS
        pgs->so = NULL;
-       pgs->mbuf = NULL;
 #endif
        total_pages = pgs->enc_cnt;
        npages = 0;
@@ -1654,14 +1652,14 @@ ktls_work_thread(void *ctx)
                mtx_unlock(&wq->mtx);
 
                STAILQ_FOREACH_SAFE(p, &local_head, stailq, n) {
-                       if (p->mbuf != NULL) {
-                               ktls_encrypt(p);
-                               counter_u64_add(ktls_cnt_on, -1);
-                       } else {
+                       if (p->flags & EPG_FLAG_2FREE) {
                                tls = p->tls;
                                ktls_free(tls);
                                m = __containerof(p, struct mbuf, m_ext_pgs);
                                uma_zfree(zone_mbuf, m);
+                       } else {
+                               ktls_encrypt(p);
+                               counter_u64_add(ktls_cnt_on, -1);
                        }
                }
        }

Modified: head/sys/sys/mbuf.h
==============================================================================
--- head/sys/sys/mbuf.h Sat May  2 22:49:14 2020        (r360571)
+++ head/sys/sys/mbuf.h Sat May  2 22:56:22 2020        (r360572)
@@ -365,13 +365,13 @@ struct mbuf {
                                        uint16_t last_pg_len;
                                        uint8_t flags;
 #define        EPG_FLAG_ANON   0x1     /* Data can be encrypted in place. */
+#define        EPG_FLAG_2FREE  0x2     /* Scheduled for free. */
                                        uint8_t record_type;
                                        uint8_t spare[2];
                                        int     enc_cnt;
                                        struct ktls_session *tls;
                                        struct socket   *so;
                                        uint64_t        seqno;
-                                       struct mbuf     *mbuf;
                                        STAILQ_ENTRY(mbuf_ext_pgs) stailq;
                                } m_ext_pgs;
                        };
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to