Michal Hocko <mhocko@xxxxxxxx> wrote: > + old_tbl = rht_dereference_rcu(ht->tbl, ht); > + size = tbl->size; > + > + data = ERR_PTR(-EBUSY); > + > + if (rht_grow_above_75(ht, tbl)) > + size *= 2; > + /* Do not schedule more than one rehash */ > + else if (old_tbl != tbl) > + return data; > + > + data = ERR_PTR(-ENOMEM); > + > + rcu_read_unlock(); > + new_tbl = bucket_table_alloc(ht, size, GFP_KERNEL); > + rcu_read_lock(); I don't think this is going to work, there can be callers that rely on rcu protected data structures getting free'd. Also, network stack assumes synchronize_rcu() means that all inflight packets have completed processing.