diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ppp/ppp_generic.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index bd4303944e44..a404552555d4 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c | |||
@@ -1915,21 +1915,23 @@ static void __ppp_channel_push(struct channel *pch) | |||
1915 | spin_unlock(&pch->downl); | 1915 | spin_unlock(&pch->downl); |
1916 | /* see if there is anything from the attached unit to be sent */ | 1916 | /* see if there is anything from the attached unit to be sent */ |
1917 | if (skb_queue_empty(&pch->file.xq)) { | 1917 | if (skb_queue_empty(&pch->file.xq)) { |
1918 | read_lock(&pch->upl); | ||
1919 | ppp = pch->ppp; | 1918 | ppp = pch->ppp; |
1920 | if (ppp) | 1919 | if (ppp) |
1921 | ppp_xmit_process(ppp); | 1920 | __ppp_xmit_process(ppp); |
1922 | read_unlock(&pch->upl); | ||
1923 | } | 1921 | } |
1924 | } | 1922 | } |
1925 | 1923 | ||
1926 | static void ppp_channel_push(struct channel *pch) | 1924 | static void ppp_channel_push(struct channel *pch) |
1927 | { | 1925 | { |
1928 | local_bh_disable(); | 1926 | read_lock_bh(&pch->upl); |
1929 | 1927 | if (pch->ppp) { | |
1930 | __ppp_channel_push(pch); | 1928 | (*this_cpu_ptr(pch->ppp->xmit_recursion))++; |
1931 | 1929 | __ppp_channel_push(pch); | |
1932 | local_bh_enable(); | 1930 | (*this_cpu_ptr(pch->ppp->xmit_recursion))--; |
1931 | } else { | ||
1932 | __ppp_channel_push(pch); | ||
1933 | } | ||
1934 | read_unlock_bh(&pch->upl); | ||
1933 | } | 1935 | } |
1934 | 1936 | ||
1935 | /* | 1937 | /* |