net/mlx5: Add missing inline to stub esw_add_restore_rule
[linux-2.6-microblaze.git] / include / net / sock.h
index 3285645..b5cca7b 100644 (file)
@@ -527,10 +527,43 @@ enum sk_pacing {
        SK_PACING_FQ            = 2,
 };
 
+/* Pointer stored in sk_user_data might not be suitable for copying
+ * when cloning the socket. For instance, it can point to a reference
+ * counted object. sk_user_data bottom bit is set if pointer must not
+ * be copied.
+ */
+#define SK_USER_DATA_NOCOPY    1UL
+#define SK_USER_DATA_PTRMASK   ~(SK_USER_DATA_NOCOPY)
+
+/**
+ * sk_user_data_is_nocopy - Test if sk_user_data pointer must not be copied
+ * @sk: socket
+ */
+static inline bool sk_user_data_is_nocopy(const struct sock *sk)
+{
+       return ((uintptr_t)sk->sk_user_data & SK_USER_DATA_NOCOPY);
+}
+
 #define __sk_user_data(sk) ((*((void __rcu **)&(sk)->sk_user_data)))
 
-#define rcu_dereference_sk_user_data(sk)       rcu_dereference(__sk_user_data((sk)))
-#define rcu_assign_sk_user_data(sk, ptr)       rcu_assign_pointer(__sk_user_data((sk)), ptr)
+#define rcu_dereference_sk_user_data(sk)                               \
+({                                                                     \
+       void *__tmp = rcu_dereference(__sk_user_data((sk)));            \
+       (void *)((uintptr_t)__tmp & SK_USER_DATA_PTRMASK);              \
+})
+#define rcu_assign_sk_user_data(sk, ptr)                               \
+({                                                                     \
+       uintptr_t __tmp = (uintptr_t)(ptr);                             \
+       WARN_ON_ONCE(__tmp & ~SK_USER_DATA_PTRMASK);                    \
+       rcu_assign_pointer(__sk_user_data((sk)), __tmp);                \
+})
+#define rcu_assign_sk_user_data_nocopy(sk, ptr)                                \
+({                                                                     \
+       uintptr_t __tmp = (uintptr_t)(ptr);                             \
+       WARN_ON_ONCE(__tmp & ~SK_USER_DATA_PTRMASK);                    \
+       rcu_assign_pointer(__sk_user_data((sk)),                        \
+                          __tmp | SK_USER_DATA_NOCOPY);                \
+})
 
 /*
  * SK_CAN_REUSE and SK_NO_REUSE on a socket mean that the socket is OK