On 08/01/18(Mon) 11:13, David Gwynne wrote:
> this is tx mitigation again, ie, defer calling an interfaces start
> routine until at least 4 packets are queued, or a task fires.
> 
> the task firing is a problem for things like gif or vxlan that encap
> a packet in ip and send it through the ip stack again. the ip stack
> expects NET_RLOCK to be held. that is implicitly true when sending
> out of the network stack, but not when the bundle task fires.

Well if_start() is a driver function.  It should not require the
NET_LOCK().  pf(4) has been fixed to not be re-entrant so the same
thing has to be done for pseudo-driver.  I like the fact that your
diff is defining a new boundary between driver protected states and
stack protected states.

Here's a diff for gif(4), ok?

Index: net/if_gif.c
===================================================================
RCS file: /cvs/src/sys/net/if_gif.c,v
retrieving revision 1.105
diff -u -p -r1.105 if_gif.c
--- net/if_gif.c        20 Nov 2017 10:35:24 -0000      1.105
+++ net/if_gif.c        8 Jan 2018 14:05:45 -0000
@@ -231,17 +231,11 @@ gif_start(struct ifnet *ifp)
 
                switch (sc->gif_psrc->sa_family) {
                case AF_INET:
-                       ip_output(m, NULL, NULL, 0, NULL, NULL, 0);
+                       ip_send(m);
                        break;
 #ifdef INET6
                case AF_INET6:
-                       /*
-                        * force fragmentation to minimum MTU, to avoid path
-                        * MTU discovery. It is too painful to ask for resend
-                        * of inner packet, to achieve path MTU discovery for
-                        * encapsulated packets.
-                        */
-                       ip6_output(m, 0, NULL, IPV6_MINMTU, 0, NULL);
+                       ip6_send(m);
                        break;
 #endif
                default:

Reply via email to