diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-12-02 18:55:05 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-12-02 18:55:05 -0500 |
commit | e1825e7515010053e44287e6e78f9078cd1916a9 (patch) | |
tree | 6c0a2a64926b8063ba934b7083f5f43011b43990 /net/unix | |
parent | 5d279dcf98350ac3cbfa43c6aa62f4305408f2df (diff) | |
parent | 44ae98b53961e7c8c1d47bbffaf08c4f7bf29249 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (30 commits)
MAINTAINERS: add netdev to ATM
ATM: horizon, fix hrz_probe fail path
pppol2tp: Add missing sock_put() in pppol2tp_release()
net: Fix soft lockups/OOM issues w/ unix garbage collector
macvlan: don't broadcast PAUSE frames to macvlan devices
Phonet: fix oops in phonet_address_del() on non-Phonet device
netfilter: ctnetlink: fix GFP_KERNEL allocation under spinlock
sungem: Fix PCS_MIICTRL register write in gem_init_phy().
net: make skb_truesize_bug() call WARN()
net: hp-plus uses eip_poll
net/wireless/reg.c: fix bad WARN_ON in if statement
ath5k: disable beacon filter when station is not associated
ath5k: fix Security issue in DebugFS part of ath5k
ath9k: correct expected max RX buffer size
ath9k: Fix SW-IOMMU bounce buffer starvation
mac80211 : Fix setting ad-hoc mode and non-ibss channel
iwlagn: fix DMA sync
phylib: Add Vitesse VSC8221 SGMII PHY
rose: zero length frame filtering in af_rose.c
bridge: netfilter: fix update_pmtu crash with GRE
...
Diffstat (limited to 'net/unix')
-rw-r--r-- | net/unix/af_unix.c | 2 | ||||
-rw-r--r-- | net/unix/garbage.c | 13 |
2 files changed, 12 insertions, 3 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index eb90f77bb0e2..66d5ac4773ab 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -1343,6 +1343,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock, | |||
1343 | 1343 | ||
1344 | if (NULL == siocb->scm) | 1344 | if (NULL == siocb->scm) |
1345 | siocb->scm = &tmp_scm; | 1345 | siocb->scm = &tmp_scm; |
1346 | wait_for_unix_gc(); | ||
1346 | err = scm_send(sock, msg, siocb->scm); | 1347 | err = scm_send(sock, msg, siocb->scm); |
1347 | if (err < 0) | 1348 | if (err < 0) |
1348 | return err; | 1349 | return err; |
@@ -1493,6 +1494,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock, | |||
1493 | 1494 | ||
1494 | if (NULL == siocb->scm) | 1495 | if (NULL == siocb->scm) |
1495 | siocb->scm = &tmp_scm; | 1496 | siocb->scm = &tmp_scm; |
1497 | wait_for_unix_gc(); | ||
1496 | err = scm_send(sock, msg, siocb->scm); | 1498 | err = scm_send(sock, msg, siocb->scm); |
1497 | if (err < 0) | 1499 | if (err < 0) |
1498 | return err; | 1500 | return err; |
diff --git a/net/unix/garbage.c b/net/unix/garbage.c index 6d4a9a8de5ef..abb3ab34cb1e 100644 --- a/net/unix/garbage.c +++ b/net/unix/garbage.c | |||
@@ -80,6 +80,7 @@ | |||
80 | #include <linux/file.h> | 80 | #include <linux/file.h> |
81 | #include <linux/proc_fs.h> | 81 | #include <linux/proc_fs.h> |
82 | #include <linux/mutex.h> | 82 | #include <linux/mutex.h> |
83 | #include <linux/wait.h> | ||
83 | 84 | ||
84 | #include <net/sock.h> | 85 | #include <net/sock.h> |
85 | #include <net/af_unix.h> | 86 | #include <net/af_unix.h> |
@@ -91,6 +92,7 @@ | |||
91 | static LIST_HEAD(gc_inflight_list); | 92 | static LIST_HEAD(gc_inflight_list); |
92 | static LIST_HEAD(gc_candidates); | 93 | static LIST_HEAD(gc_candidates); |
93 | static DEFINE_SPINLOCK(unix_gc_lock); | 94 | static DEFINE_SPINLOCK(unix_gc_lock); |
95 | static DECLARE_WAIT_QUEUE_HEAD(unix_gc_wait); | ||
94 | 96 | ||
95 | unsigned int unix_tot_inflight; | 97 | unsigned int unix_tot_inflight; |
96 | 98 | ||
@@ -266,12 +268,16 @@ static void inc_inflight_move_tail(struct unix_sock *u) | |||
266 | list_move_tail(&u->link, &gc_candidates); | 268 | list_move_tail(&u->link, &gc_candidates); |
267 | } | 269 | } |
268 | 270 | ||
269 | /* The external entry point: unix_gc() */ | 271 | static bool gc_in_progress = false; |
270 | 272 | ||
271 | void unix_gc(void) | 273 | void wait_for_unix_gc(void) |
272 | { | 274 | { |
273 | static bool gc_in_progress = false; | 275 | wait_event(unix_gc_wait, gc_in_progress == false); |
276 | } | ||
274 | 277 | ||
278 | /* The external entry point: unix_gc() */ | ||
279 | void unix_gc(void) | ||
280 | { | ||
275 | struct unix_sock *u; | 281 | struct unix_sock *u; |
276 | struct unix_sock *next; | 282 | struct unix_sock *next; |
277 | struct sk_buff_head hitlist; | 283 | struct sk_buff_head hitlist; |
@@ -376,6 +382,7 @@ void unix_gc(void) | |||
376 | /* All candidates should have been detached by now. */ | 382 | /* All candidates should have been detached by now. */ |
377 | BUG_ON(!list_empty(&gc_candidates)); | 383 | BUG_ON(!list_empty(&gc_candidates)); |
378 | gc_in_progress = false; | 384 | gc_in_progress = false; |
385 | wake_up(&unix_gc_wait); | ||
379 | 386 | ||
380 | out: | 387 | out: |
381 | spin_unlock(&unix_gc_lock); | 388 | spin_unlock(&unix_gc_lock); |