|
@@ -1713,18 +1713,34 @@ void *sock_kmalloc(struct sock *sk, int size, gfp_t priority)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(sock_kmalloc);
|
|
EXPORT_SYMBOL(sock_kmalloc);
|
|
|
|
|
|
-/*
|
|
|
|
- * Free an option memory block.
|
|
|
|
|
|
+/* Free an option memory block. Note, we actually want the inline
|
|
|
|
+ * here as this allows gcc to detect the nullify and fold away the
|
|
|
|
+ * condition entirely.
|
|
*/
|
|
*/
|
|
-void sock_kfree_s(struct sock *sk, void *mem, int size)
|
|
|
|
|
|
+static inline void __sock_kfree_s(struct sock *sk, void *mem, int size,
|
|
|
|
+ const bool nullify)
|
|
{
|
|
{
|
|
if (WARN_ON_ONCE(!mem))
|
|
if (WARN_ON_ONCE(!mem))
|
|
return;
|
|
return;
|
|
- kfree(mem);
|
|
|
|
|
|
+ if (nullify)
|
|
|
|
+ kzfree(mem);
|
|
|
|
+ else
|
|
|
|
+ kfree(mem);
|
|
atomic_sub(size, &sk->sk_omem_alloc);
|
|
atomic_sub(size, &sk->sk_omem_alloc);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+void sock_kfree_s(struct sock *sk, void *mem, int size)
|
|
|
|
+{
|
|
|
|
+ __sock_kfree_s(sk, mem, size, false);
|
|
|
|
+}
|
|
EXPORT_SYMBOL(sock_kfree_s);
|
|
EXPORT_SYMBOL(sock_kfree_s);
|
|
|
|
|
|
|
|
+void sock_kzfree_s(struct sock *sk, void *mem, int size)
|
|
|
|
+{
|
|
|
|
+ __sock_kfree_s(sk, mem, size, true);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(sock_kzfree_s);
|
|
|
|
+
|
|
/* It is almost wait_for_tcp_memory minus release_sock/lock_sock.
|
|
/* It is almost wait_for_tcp_memory minus release_sock/lock_sock.
|
|
I think, these locks should be removed for datagram sockets.
|
|
I think, these locks should be removed for datagram sockets.
|
|
*/
|
|
*/
|