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/garbage.c | |
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/garbage.c')
-rw-r--r-- | net/unix/garbage.c | 13 |
1 files changed, 10 insertions, 3 deletions
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); |