0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066 #include <linux/kernel.h>
0067 #include <linux/string.h>
0068 #include <linux/socket.h>
0069 #include <linux/un.h>
0070 #include <linux/net.h>
0071 #include <linux/fs.h>
0072 #include <linux/skbuff.h>
0073 #include <linux/netdevice.h>
0074 #include <linux/file.h>
0075 #include <linux/proc_fs.h>
0076 #include <linux/mutex.h>
0077 #include <linux/wait.h>
0078
0079 #include <net/sock.h>
0080 #include <net/af_unix.h>
0081 #include <net/scm.h>
0082 #include <net/tcp_states.h>
0083
0084 #include "scm.h"
0085
0086
0087
0088 static LIST_HEAD(gc_candidates);
0089 static DECLARE_WAIT_QUEUE_HEAD(unix_gc_wait);
0090
0091 static void scan_inflight(struct sock *x, void (*func)(struct unix_sock *),
0092 struct sk_buff_head *hitlist)
0093 {
0094 struct sk_buff *skb;
0095 struct sk_buff *next;
0096
0097 spin_lock(&x->sk_receive_queue.lock);
0098 skb_queue_walk_safe(&x->sk_receive_queue, skb, next) {
0099
0100 if (UNIXCB(skb).fp) {
0101 bool hit = false;
0102
0103 int nfd = UNIXCB(skb).fp->count;
0104 struct file **fp = UNIXCB(skb).fp->fp;
0105
0106 while (nfd--) {
0107
0108 struct sock *sk = unix_get_socket(*fp++);
0109
0110 if (sk) {
0111 struct unix_sock *u = unix_sk(sk);
0112
0113
0114
0115
0116
0117 if (test_bit(UNIX_GC_CANDIDATE, &u->gc_flags)) {
0118 hit = true;
0119
0120 func(u);
0121 }
0122 }
0123 }
0124 if (hit && hitlist != NULL) {
0125 __skb_unlink(skb, &x->sk_receive_queue);
0126 __skb_queue_tail(hitlist, skb);
0127 }
0128 }
0129 }
0130 spin_unlock(&x->sk_receive_queue.lock);
0131 }
0132
0133 static void scan_children(struct sock *x, void (*func)(struct unix_sock *),
0134 struct sk_buff_head *hitlist)
0135 {
0136 if (x->sk_state != TCP_LISTEN) {
0137 scan_inflight(x, func, hitlist);
0138 } else {
0139 struct sk_buff *skb;
0140 struct sk_buff *next;
0141 struct unix_sock *u;
0142 LIST_HEAD(embryos);
0143
0144
0145
0146
0147 spin_lock(&x->sk_receive_queue.lock);
0148 skb_queue_walk_safe(&x->sk_receive_queue, skb, next) {
0149 u = unix_sk(skb->sk);
0150
0151
0152
0153
0154 BUG_ON(!list_empty(&u->link));
0155 list_add_tail(&u->link, &embryos);
0156 }
0157 spin_unlock(&x->sk_receive_queue.lock);
0158
0159 while (!list_empty(&embryos)) {
0160 u = list_entry(embryos.next, struct unix_sock, link);
0161 scan_inflight(&u->sk, func, hitlist);
0162 list_del_init(&u->link);
0163 }
0164 }
0165 }
0166
0167 static void dec_inflight(struct unix_sock *usk)
0168 {
0169 atomic_long_dec(&usk->inflight);
0170 }
0171
0172 static void inc_inflight(struct unix_sock *usk)
0173 {
0174 atomic_long_inc(&usk->inflight);
0175 }
0176
0177 static void inc_inflight_move_tail(struct unix_sock *u)
0178 {
0179 atomic_long_inc(&u->inflight);
0180
0181
0182
0183
0184 if (test_bit(UNIX_GC_MAYBE_CYCLE, &u->gc_flags))
0185 list_move_tail(&u->link, &gc_candidates);
0186 }
0187
0188 static bool gc_in_progress;
0189 #define UNIX_INFLIGHT_TRIGGER_GC 16000
0190
0191 void wait_for_unix_gc(void)
0192 {
0193
0194
0195
0196
0197
0198 if (READ_ONCE(unix_tot_inflight) > UNIX_INFLIGHT_TRIGGER_GC &&
0199 !READ_ONCE(gc_in_progress))
0200 unix_gc();
0201 wait_event(unix_gc_wait, gc_in_progress == false);
0202 }
0203
0204
0205 void unix_gc(void)
0206 {
0207 struct unix_sock *u;
0208 struct unix_sock *next;
0209 struct sk_buff_head hitlist;
0210 struct list_head cursor;
0211 LIST_HEAD(not_cycle_list);
0212
0213 spin_lock(&unix_gc_lock);
0214
0215
0216 if (gc_in_progress)
0217 goto out;
0218
0219
0220 WRITE_ONCE(gc_in_progress, true);
0221
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237 list_for_each_entry_safe(u, next, &gc_inflight_list, link) {
0238 long total_refs;
0239 long inflight_refs;
0240
0241 total_refs = file_count(u->sk.sk_socket->file);
0242 inflight_refs = atomic_long_read(&u->inflight);
0243
0244 BUG_ON(inflight_refs < 1);
0245 BUG_ON(total_refs < inflight_refs);
0246 if (total_refs == inflight_refs) {
0247 list_move_tail(&u->link, &gc_candidates);
0248 __set_bit(UNIX_GC_CANDIDATE, &u->gc_flags);
0249 __set_bit(UNIX_GC_MAYBE_CYCLE, &u->gc_flags);
0250 }
0251 }
0252
0253
0254
0255
0256 list_for_each_entry(u, &gc_candidates, link)
0257 scan_children(&u->sk, dec_inflight, NULL);
0258
0259
0260
0261
0262
0263
0264
0265
0266 list_add(&cursor, &gc_candidates);
0267 while (cursor.next != &gc_candidates) {
0268 u = list_entry(cursor.next, struct unix_sock, link);
0269
0270
0271 list_move(&cursor, &u->link);
0272
0273 if (atomic_long_read(&u->inflight) > 0) {
0274 list_move_tail(&u->link, ¬_cycle_list);
0275 __clear_bit(UNIX_GC_MAYBE_CYCLE, &u->gc_flags);
0276 scan_children(&u->sk, inc_inflight_move_tail, NULL);
0277 }
0278 }
0279 list_del(&cursor);
0280
0281
0282
0283
0284
0285 skb_queue_head_init(&hitlist);
0286 list_for_each_entry(u, &gc_candidates, link)
0287 scan_children(&u->sk, inc_inflight, &hitlist);
0288
0289
0290
0291
0292 while (!list_empty(¬_cycle_list)) {
0293 u = list_entry(not_cycle_list.next, struct unix_sock, link);
0294 __clear_bit(UNIX_GC_CANDIDATE, &u->gc_flags);
0295 list_move_tail(&u->link, &gc_inflight_list);
0296 }
0297
0298 spin_unlock(&unix_gc_lock);
0299
0300
0301 __skb_queue_purge(&hitlist);
0302
0303 spin_lock(&unix_gc_lock);
0304
0305
0306 BUG_ON(!list_empty(&gc_candidates));
0307
0308
0309 WRITE_ONCE(gc_in_progress, false);
0310
0311 wake_up(&unix_gc_wait);
0312
0313 out:
0314 spin_unlock(&unix_gc_lock);
0315 }