On Mon, Sep 10, 2018 at 5:24 PM Sowmini Varadhan <sowmini.varad...@oracle.com> wrote: > > On (09/10/18 17:16), Cong Wang wrote: > > > > > > On (09/10/18 16:51), Cong Wang wrote: > > > > > > > > __rds_create_bind_key(key, addr, port, scope_id); > > > > - rs = rhashtable_lookup_fast(&bind_hash_table, key, ht_parms); > > > > + rcu_read_lock(); > > > > + rs = rhashtable_lookup(&bind_hash_table, key, ht_parms); > > > > if (rs && !sock_flag(rds_rs_to_sk(rs), SOCK_DEAD)) > > > > rds_sock_addref(rs); > > > > else > > > > rs = NULL; > > > > + rcu_read_unlock(); > > > > > > aiui, the rcu_read lock/unlock is only useful if the write > > > side doing destructive operations does something to make sure readers > > > are done before doing the destructive opertion. AFAIK, that does > > > not exist for rds socket management today > > > > That is exactly why we need it here, right? > > Maybe I am confused, what exactly is the patch you are proposing? > > Does it have the SOCK_RCU_FREE change?
Yes, that patch is obviously on top of this patch. > Does it have the rcu_read_lock you have above? > Where is the call_rcu? Sure, as it is on top of this patch, the call_rcu() is here: void sk_destruct(struct sock *sk) { if (sock_flag(sk, SOCK_RCU_FREE)) call_rcu(&sk->sk_rcu, __sk_destruct); else __sk_destruct(&sk->sk_rcu); } > > > Hmm, so you are saying synchronize_rcu() is kinda more correct > > than call_rcu()?? > > > I'm not saying that, I'm asking "what exactly is the patch > you are proposing?" The only one on record is > http://patchwork.ozlabs.org/patch/968282/ > which does not have either synchronize_rcu or call_rcu. It is very obviously on top of this patch ($subject). > > > I never hear this before, would like to know why. > > Please post precise patches first. Already showed you precisely what is is, just on top of this one.