static DEFINE_MUTEX(proto_list_mutex);
 static LIST_HEAD(proto_list);
 
+static void sock_def_write_space(struct sock *sk);
+
 /**
  * sk_ns_capable - General socket capability test
  * @sk: Socket to use a capability on or through
 {
        struct sock *sk = skb->sk;
        unsigned int len = skb->truesize;
+       bool free;
 
        if (!sock_flag(sk, SOCK_USE_WRITE_QUEUE)) {
+               if (sock_flag(sk, SOCK_RCU_FREE) &&
+                   sk->sk_write_space == sock_def_write_space) {
+                       rcu_read_lock();
+                       free = refcount_sub_and_test(len, &sk->sk_wmem_alloc);
+                       sock_def_write_space(sk);
+                       rcu_read_unlock();
+                       if (unlikely(free))
+                               __sk_free(sk);
+                       return;
+               }
+
                /*
                 * Keep a reference on sk_wmem_alloc, this will be released
                 * after sk_write_space() call