Author: mmacy
Date: Mon May 21 16:13:43 2018
New Revision: 333984
URL: https://svnweb.freebsd.org/changeset/base/333984

Log:
  inpcb: revert deferred inpcb free pending further review

Modified:
  head/sys/netinet/in_pcb.c
  head/sys/netinet/in_pcb.h

Modified: head/sys/netinet/in_pcb.c
==============================================================================
--- head/sys/netinet/in_pcb.c   Mon May 21 16:03:51 2018        (r333983)
+++ head/sys/netinet/in_pcb.c   Mon May 21 16:13:43 2018        (r333984)
@@ -1336,34 +1336,6 @@ in_pcblist_rele_rlocked(epoch_context_t ctx)
        free(il, M_TEMP);
 }
 
-static void
-in_pcbfree_deferred(epoch_context_t ctx)
-{
-       struct inpcb *inp;
-       struct inpcbinfo *pcbinfo;
-
-       inp = __containerof(ctx, struct inpcb, inp_epoch_ctx);
-       pcbinfo = inp->inp_pcbinfo;
-
-       INP_WLOCK(inp); 
-       /* XXXRW: Do as much as possible here. */
-#if defined(IPSEC) || defined(IPSEC_SUPPORT)
-       if (inp->inp_sp != NULL)
-               ipsec_delete_pcbpolicy(inp);
-#endif
-       if (inp->inp_options)
-               (void)m_free(inp->inp_options);
-
-       inp->inp_vflag = 0;
-       inp->inp_flags2 |= INP_FREED;
-       crfree(inp->inp_cred);
-#ifdef MAC
-       mac_inpcb_destroy(inp);
-#endif
-       if (!in_pcbrele_wlocked(inp))
-               INP_WUNLOCK(inp);
-}
-
 /*
  * Unconditionally schedule an inpcb to be freed by decrementing its
  * reference count, which should occur only after the inpcb has been detached
@@ -1376,15 +1348,16 @@ in_pcbfree_deferred(epoch_context_t ctx)
 void
 in_pcbfree(struct inpcb *inp)
 {
+       struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
+
 #ifdef INET6
        struct ip6_moptions *im6o = NULL;
 #endif
 #ifdef INET
        struct ip_moptions *imo = NULL;
 #endif
-       struct inpcbinfo *pcbinfo = inp->inp_pcbinfo;
-
        KASSERT(inp->inp_socket == NULL, ("%s: inp_socket != NULL", __func__));
+
        KASSERT((inp->inp_flags2 & INP_FREED) == 0,
            ("%s: called twice for pcb %p", __func__, inp));
        if (inp->inp_flags2 & INP_FREED) {
@@ -1400,27 +1373,45 @@ in_pcbfree(struct inpcb *inp)
        }
 #endif
        INP_WLOCK_ASSERT(inp);
+
 #ifdef INET
        imo = inp->inp_moptions;
        inp->inp_moptions = NULL;
-       inp_freemoptions(imo);
 #endif
+       /* XXXRW: Do as much as possible here. */
+#if defined(IPSEC) || defined(IPSEC_SUPPORT)
+       if (inp->inp_sp != NULL)
+               ipsec_delete_pcbpolicy(inp);
+#endif
+       INP_LIST_WLOCK(pcbinfo);
+       inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
+       in_pcbremlists(inp);
+       INP_LIST_WUNLOCK(pcbinfo);
 #ifdef INET6
        if (inp->inp_vflag & INP_IPV6PROTO) {
                ip6_freepcbopts(inp->in6p_outputopts);
                im6o = inp->in6p_moptions;
                inp->in6p_moptions = NULL;
-               ip6_freemoptions(im6o);
        }
 #endif
-       /* Remove first from list */
-       INP_LIST_WLOCK(pcbinfo);
-       inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
-       in_pcbremlists(inp);
-       INP_LIST_WUNLOCK(pcbinfo);
+       if (inp->inp_options)
+               (void)m_free(inp->inp_options);
        RO_INVALIDATE_CACHE(&inp->inp_route);
-       INP_WUNLOCK(inp);
-       epoch_call(net_epoch_preempt, &inp->inp_epoch_ctx, in_pcbfree_deferred);
+
+       inp->inp_vflag = 0;
+       inp->inp_flags2 |= INP_FREED;
+       crfree(inp->inp_cred);
+#ifdef MAC
+       mac_inpcb_destroy(inp);
+#endif
+#ifdef INET6
+       ip6_freemoptions(im6o);
+#endif
+#ifdef INET
+       inp_freemoptions(imo);
+#endif
+       if (!in_pcbrele_wlocked(inp))
+               INP_WUNLOCK(inp);
 }
 
 /*

Modified: head/sys/netinet/in_pcb.h
==============================================================================
--- head/sys/netinet/in_pcb.h   Mon May 21 16:03:51 2018        (r333983)
+++ head/sys/netinet/in_pcb.h   Mon May 21 16:13:43 2018        (r333984)
@@ -328,7 +328,6 @@ struct inpcb {
        LIST_ENTRY(inpcb) inp_list;     /* (p/l) list for all PCBs for proto */
                                        /* (p[w]) for list iteration */
                                        /* (p[r]/l) for addition/removal */
-       struct epoch_context inp_epoch_ctx;
 };
 #endif /* _KERNEL */
 
_______________________________________________
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