Thread (14 messages) 14 messages, 5 authors, 2015-11-02

Re: kernel BUG in ipmr_queue_xmit()

From: Ani Sinha <hidden>
Date: 2015-10-30 17:47:56

On Fri, Oct 30, 2015 at 4:00 AM, Eric Dumazet [off-list ref] wrote:
On Fri, 2015-10-30 at 11:48 +0100, Florian Westphal wrote:
quoted
Hannes Frederic Sowa [off-list ref] wrote:
quoted
quoted
quoted
quoted
@@ -936,7 +936,9 @@ static void ipmr_cache_resolve(struct net *net, struct mr_table *mrt,

                      rtnl_unicast(skb, net, NETLINK_CB(skb).portid);
              } else {
+                     preempt_disable();
                      ip_mr_forward(net, mrt, skb, c, 0);
+                     preempt_enable();
              }
      }
 }
I do not believe this fix is correct.
Yes, sorry.  I should have suggested local_bh_disable instead.
quoted
Better replace the
IP_INC_STATS_BH() by IP_INC_STATS()

and IP_ADD_STATS_BH() by IP_ADD_STATS()
Hmm, whats the rationale for this?

Note that IP_ADD_STATS_BH in question is unconditional (not in
error path).  It seems that its virtually always called from softirq
except in the setsockopt case.
The naming of the functions is bad if you compare them to e.g.
spin_lock_bh.

STATS_BH can only be used from bottom half and the normal ones (without
_BH) can be called from everywhere. It is a common pattern in the
kernel.

Eric's proposal is correct.
Yes, its correct but it results in 4 additonal bh on/off calls
for the common case, hence my question.

Moving the one ip_mr_forward into bh-off keeps the bh-disable thing
in the setsockopt path.
I have no idea how long is the ip_mr_forward(net, mrt, skb, c, 0)
section, and if GFP_KERNEL allocations were attempted in this path.

The proposed fix might add other regressions.

I do not want to spend time auditing this code that nobody uses.

While on x86, IP_INC_STATS() does not use additional bh on/off calls
for 32 bit archs, it does in SNMP_ADD_STATS64_USER()

In general, we should disable interrupts (even if soft) for limited
amount of times.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help