From: Miklos Szeredi <redacted>
Date: Thu, 29 Sep 2016 14:09:14 +0200
quoted hunk ↗ jump to hunk
@@ -1550,6 +1550,17 @@ static int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb)
return max_level;
}
+static void unix_peek_fds(struct scm_cookie *scm, struct sk_buff *skb)
+{
+ scm->fp = scm_fp_dup(UNIXCB(skb).fp);
+ /*
+ * During garbage collection it is assumed that in-flight sockets don't
+ * get a new external reference. So we need to wait until current run
+ * finishes.
+ */
+ unix_gc_barrier();
+}
...
quoted hunk ↗ jump to hunk
@@ -266,6 +266,11 @@ void wait_for_unix_gc(void)
wait_event(unix_gc_wait, gc_in_progress == false);
}
+void unix_gc_barrier(void)
+{
+ spin_unlock_wait(&unix_gc_lock);
+}
Can you explain why wait_for_unix_gc() isn't appropriate? I'm a little
bit uncomfortable with a spinlock wait like this, and would rather see
something like the existing helper used.
Thanks.