@@ -333,6 +333,8 @@ int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb)
333
333
struct dst_entry * dst ;
334
334
int ret ;
335
335
336
+ local_bh_disable ();
337
+
336
338
if (dev_xmit_recursion ()) {
337
339
net_crit_ratelimited ("%s(): recursion limit reached on datapath\n" ,
338
340
__func__ );
@@ -348,8 +350,10 @@ int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb)
348
350
lwtstate = dst -> lwtstate ;
349
351
350
352
if (lwtstate -> type == LWTUNNEL_ENCAP_NONE ||
351
- lwtstate -> type > LWTUNNEL_ENCAP_MAX )
352
- return 0 ;
353
+ lwtstate -> type > LWTUNNEL_ENCAP_MAX ) {
354
+ ret = 0 ;
355
+ goto out ;
356
+ }
353
357
354
358
ret = - EOPNOTSUPP ;
355
359
rcu_read_lock ();
@@ -364,11 +368,13 @@ int lwtunnel_output(struct net *net, struct sock *sk, struct sk_buff *skb)
364
368
if (ret == - EOPNOTSUPP )
365
369
goto drop ;
366
370
367
- return ret ;
371
+ goto out ;
368
372
369
373
drop :
370
374
kfree_skb (skb );
371
375
376
+ out :
377
+ local_bh_enable ();
372
378
return ret ;
373
379
}
374
380
EXPORT_SYMBOL_GPL (lwtunnel_output );
@@ -380,6 +386,8 @@ int lwtunnel_xmit(struct sk_buff *skb)
380
386
struct dst_entry * dst ;
381
387
int ret ;
382
388
389
+ local_bh_disable ();
390
+
383
391
if (dev_xmit_recursion ()) {
384
392
net_crit_ratelimited ("%s(): recursion limit reached on datapath\n" ,
385
393
__func__ );
@@ -396,8 +404,10 @@ int lwtunnel_xmit(struct sk_buff *skb)
396
404
lwtstate = dst -> lwtstate ;
397
405
398
406
if (lwtstate -> type == LWTUNNEL_ENCAP_NONE ||
399
- lwtstate -> type > LWTUNNEL_ENCAP_MAX )
400
- return 0 ;
407
+ lwtstate -> type > LWTUNNEL_ENCAP_MAX ) {
408
+ ret = 0 ;
409
+ goto out ;
410
+ }
401
411
402
412
ret = - EOPNOTSUPP ;
403
413
rcu_read_lock ();
@@ -412,11 +422,13 @@ int lwtunnel_xmit(struct sk_buff *skb)
412
422
if (ret == - EOPNOTSUPP )
413
423
goto drop ;
414
424
415
- return ret ;
425
+ goto out ;
416
426
417
427
drop :
418
428
kfree_skb (skb );
419
429
430
+ out :
431
+ local_bh_enable ();
420
432
return ret ;
421
433
}
422
434
EXPORT_SYMBOL_GPL (lwtunnel_xmit );
@@ -428,6 +440,8 @@ int lwtunnel_input(struct sk_buff *skb)
428
440
struct dst_entry * dst ;
429
441
int ret ;
430
442
443
+ DEBUG_NET_WARN_ON_ONCE (!in_softirq ());
444
+
431
445
if (dev_xmit_recursion ()) {
432
446
net_crit_ratelimited ("%s(): recursion limit reached on datapath\n" ,
433
447
__func__ );
0 commit comments