Rainer Weikusat [off-list ref] writes:
Jason Baron [off-list ref] writes:
quoted
On 10/18/2015 04:58 PM, Rainer Weikusat wrote:
[...]
quoted
1)
In unix_peer_wake_relay() function, 'sk_wq' is an __rcu pointer and thus
it requires proper dereferencing. Something like:
struct unix_sock *u;
struct socket_wq *wq;
u = container_of(wait, struct unix_sock, wait);
rcu_read_lock();
wq = rcu_dereference(u->sk.sk_wq);
if (wq_has_sleeper(wq))
wake_up_interruptible_sync_poll(&wq->wait, key);
rcu_read_unlock();
I think this may be unecessary
I consider this unnecessary now.
Rationale: The wait queue is allocated and freed in tandem with the
socket inode which means it will remain allocated until after the
protocol release function (unix_release with the bulk of the
implementation being in unix_release_sock) returned. As the connection
with the other socket is broken in unix_release_sock, any relayed wake
up must have completed before this time (since both operations take
place while holding the same wait queue lock).