rtnl_unlock cleanups
Subsystems (2)
PATCH 1/5 rtnl_unlock cleanups
There is no need to process outstanding netlink user->kernel packets during rtnl_unlock now. There is no rtnl_trylock in the rtnetlink_rcv anymore.
Normal code path is the following:netlink_sendmsg
netlink_unicast
netlink_sendskb
skb_queue_tail
netlink_data_ready
rtnetlink_rcv
mutex_lock(&rtnl_mutex);
netlink_run_queue(sk, qlen, &rtnetlink_rcv_msg);
mutex_unlock(&rtnl_mutex);So, it is possible, that packets can be present in the rtnl->sk_receive_queue during rtnl_unlock, but there is no need to process them at that moment as rtnetlink_rcv for that packet is pending.
net/core/rtnetlink.c renamed from net/core/rtnetlink.c.rtnl2 +2 -6
@@ -75,8 +75,6 @@ void __rtnl_unlock(void)void rtnl_unlock (void ) {mutex_unlock (&rtnl_mutex); -if (rtnl && rtnl->sk_receive_queue.qlen) - rtnl->sk_data_ready (rtnl,0 );netdev_run_todo (); }
@@ -1319,11 +1317,9 @@ static void rtnetlink_rcv(struct sock *sunsigned int qlen =0 ;do { -mutex_lock (&rtnl_mutex); +rtnl_lock (); qlen =netlink_run_queue (sk, qlen, &rtnetlink_rcv_msg); -mutex_unlock (&rtnl_mutex); - -netdev_run_todo (); +rtnl_unlock (); }while (qlen); }
From: "Denis V. Lunev" <[email protected]>
Date: Fri, 5 Oct 2007 18:44:14 +0400
Quoted 15 lines
There is no need to process outstanding netlink
user->kernelpackets duringrtnl_unlocknow. There is nortnl_trylockin thertnetlink_rcvanymore.Normal code path is the following:
netlink_sendmsg
netlink_unicastnetlink_sendskb skb_queue_tail netlink_data_ready rtnetlink_rcv mutex_lock(&rtnl_mutex); netlink_run_queue(sk, qlen, &rtnetlink_rcv_msg); mutex_unlock(&rtnl_mutex);
Quoted 6 lines
So, it is possible, that packets can be present in the
rtnl->sk_receive_queueduringrtnl_unlock, but there is no need to process them at that moment asrtnetlink_rcvfor that packet is pending.Signed-off-by Denis V. Lunev <[email protected]>Acked-by Alexey Kuznetsov <[email protected]>
Applied.