ソースを参照

qcacmn: Use refcount APIs for sk_buff.users with 4.13+ kernels

The 4.13 Linux kernel changed the sk_buff.users type to refcount_t from
atomic_t. Add conditional compilation based on kernel version to use
appropriate refcount APIs for kernels 4.13+.

Change-Id: I6918b4f45ffa247c74e54d8653a80821ceab1a86
CRs-Fixed: 2092031
Dustin Brown 7 年 前
コミット
24c31020a2
3 ファイル変更35 行追加15 行削除
  1. 1 7
      qdf/inc/qdf_nbuf.h
  2. 1 6
      qdf/linux/src/i_qdf_nbuf.h
  3. 33 2
      qdf/linux/src/qdf_nbuf.c

+ 1 - 7
qdf/inc/qdf_nbuf.h

@@ -919,13 +919,7 @@ static inline qdf_nbuf_t qdf_nbuf_copy(qdf_nbuf_t buf)
  * Return: data pointer of this buf where new data has to be
  *         put, or NULL if there is not enough room in this buf.
  */
-
-static inline void qdf_nbuf_init_fast(qdf_nbuf_t nbuf)
-{
-	atomic_set(&nbuf->users, 1);
-	nbuf->data = nbuf->head + NET_SKB_PAD;
-	skb_reset_tail_pointer(nbuf);
-}
+void qdf_nbuf_init_fast(qdf_nbuf_t nbuf);
 #endif /* WLAN_FEATURE_FASTPATH */
 
 static inline void qdf_nbuf_tx_free(qdf_nbuf_t buf_list, int tx_err)

+ 1 - 6
qdf/linux/src/i_qdf_nbuf.h

@@ -1653,12 +1653,7 @@ static inline size_t __qdf_nbuf_tcp_tso_size(struct sk_buff *skb)
  *
  * Return: none
  */
-static inline void __qdf_nbuf_init(__qdf_nbuf_t nbuf)
-{
-	atomic_set(&nbuf->users, 1);
-	nbuf->data = nbuf->head + NET_SKB_PAD;
-	skb_reset_tail_pointer(nbuf);
-}
+void __qdf_nbuf_init(__qdf_nbuf_t nbuf);
 
 /**
  * __qdf_nbuf_set_rx_info() - set rx info

+ 33 - 2
qdf/linux/src/qdf_nbuf.c

@@ -51,6 +51,18 @@
 #include <linux/ip.h>
 #endif /* FEATURE_TSO */
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 13, 0)
+#define qdf_nbuf_users_inc atomic_inc
+#define qdf_nbuf_users_dec atomic_dec
+#define qdf_nbuf_users_set atomic_set
+#define qdf_nbuf_users_read atomic_read
+#else
+#define qdf_nbuf_users_inc refcount_inc
+#define qdf_nbuf_users_dec refcount_dec
+#define qdf_nbuf_users_set refcount_set
+#define qdf_nbuf_users_read refcount_read
+#endif /* KERNEL_VERSION(4, 13, 0) */
+
 /* Packet Counter */
 static uint32_t nbuf_tx_mgmt[QDF_NBUF_TX_PKT_STATE_MAX];
 static uint32_t nbuf_tx_data[QDF_NBUF_TX_PKT_STATE_MAX];
@@ -2196,14 +2208,14 @@ EXPORT_SYMBOL(__qdf_nbuf_get_tso_num_seg);
 
 struct sk_buff *__qdf_nbuf_inc_users(struct sk_buff *skb)
 {
-	atomic_inc(&skb->users);
+	qdf_nbuf_users_inc(&skb->users);
 	return skb;
 }
 EXPORT_SYMBOL(__qdf_nbuf_inc_users);
 
 int __qdf_nbuf_get_users(struct sk_buff *skb)
 {
-	return atomic_read(&skb->users);
+	return qdf_nbuf_users_read(&skb->users);
 }
 EXPORT_SYMBOL(__qdf_nbuf_get_users);
 
@@ -2923,3 +2935,22 @@ void qdf_nbuf_classify_pkt(struct sk_buff *skb)
 			QDF_NBUF_CB_PACKET_TYPE_WAPI;
 }
 EXPORT_SYMBOL(qdf_nbuf_classify_pkt);
+
+void __qdf_nbuf_init(__qdf_nbuf_t nbuf)
+{
+	qdf_nbuf_users_set(&nbuf->users, 1);
+	nbuf->data = nbuf->head + NET_SKB_PAD;
+	skb_reset_tail_pointer(nbuf);
+}
+EXPORT_SYMBOL(__qdf_nbuf_init);
+
+#ifdef WLAN_FEATURE_FASTPATH
+void qdf_nbuf_init_fast(qdf_nbuf_t nbuf)
+{
+	qdf_nbuf_users_set(&nbuf->users, 1);
+	nbuf->data = nbuf->head + NET_SKB_PAD;
+	skb_reset_tail_pointer(nbuf);
+}
+EXPORT_SYMBOL(qdf_nbuf_init_fast);
+#endif /* WLAN_FEATURE_FASTPATH */
+