Explorar el Código

qcacmn: check for vdev_id mismatch to deliver NBUFs to stack

Check for vdev_id mismatch to deliver NBUFs to stack to avoid
hold peer reference while giving nbuf list to stack

Change-Id: Ic475e00d5b1793ada7b26b7af3322ca2fa51836f
Chaithanya Garrepalli hace 5 años
padre
commit
52511a17d1
Se han modificado 4 ficheros con 49 adiciones y 45 borrados
  1. 16 15
      dp/wifi3.0/dp_rx.c
  2. 2 2
      dp/wifi3.0/dp_rx.h
  3. 20 25
      qdf/linux/src/i_qdf_nbuf.h
  4. 11 3
      qdf/linux/src/i_qdf_nbuf_m.h

+ 16 - 15
dp/wifi3.0/dp_rx.c

@@ -335,7 +335,7 @@ dp_get_vdev_from_peer(struct dp_soc *soc,
 
 	if (unlikely(!peer)) {
 		if (peer_id != HTT_INVALID_PEER) {
-			vdev_id = DP_PEER_METADATA_ID_GET(
+			vdev_id = DP_PEER_METADATA_VDEV_ID_GET(
 					mpdu_desc_info.peer_meta_data);
 			QDF_TRACE(QDF_MODULE_ID_DP,
 				QDF_TRACE_LEVEL_DEBUG,
@@ -1593,7 +1593,6 @@ bool dp_is_special_data(qdf_nbuf_t nbuf)
 static inline
 void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf)
 {
-	uint32_t peer_mdata;
 	uint16_t peer_id;
 	uint8_t vdev_id;
 	struct dp_vdev *vdev;
@@ -1602,13 +1601,11 @@ void dp_rx_deliver_to_stack_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf)
 	uint32_t pkt_len = 0;
 	uint8_t *rx_tlv_hdr;
 
-	peer_mdata =  QDF_NBUF_CB_RX_PEER_ID(nbuf);
-
-	peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata);
+	peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf);
 	if (peer_id > soc->max_peers)
 		goto deliver_fail;
 
-	vdev_id = DP_PEER_METADATA_ID_GET(peer_mdata);
+	vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf);
 	vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id);
 	if (!vdev || !vdev->osif_rx)
 		goto deliver_fail;
@@ -1717,6 +1714,7 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl,
 	uint32_t l2_hdr_offset = 0;
 	uint16_t msdu_len = 0;
 	uint16_t peer_id;
+	uint8_t vdev_id;
 	struct dp_peer *peer;
 	struct dp_vdev *vdev;
 	uint32_t pkt_len = 0;
@@ -1897,6 +1895,8 @@ more_data:
 		peer_mdata = mpdu_desc_info.peer_meta_data;
 		QDF_NBUF_CB_RX_PEER_ID(rx_desc->nbuf) =
 			DP_PEER_METADATA_PEER_ID_GET(peer_mdata);
+		QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) =
+			DP_PEER_METADATA_VDEV_ID_GET(peer_mdata);
 
 		/*
 		 * save msdu flags first, last and continuation msdu in
@@ -1985,12 +1985,20 @@ done:
 	while (nbuf) {
 		next = nbuf->next;
 		rx_tlv_hdr = qdf_nbuf_data(nbuf);
+		vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf);
+
+		if (deliver_list_head && vdev && (vdev->vdev_id != vdev_id)) {
+			dp_rx_deliver_to_stack(vdev, peer, deliver_list_head,
+					       deliver_list_tail);
+			deliver_list_head = NULL;
+			deliver_list_tail = NULL;
+		}
+
 		/* Get TID from struct cb->tid_val, save to tid */
 		if (qdf_nbuf_is_rx_chfrag_start(nbuf))
 			tid = qdf_nbuf_get_tid_val(nbuf);
 
-		peer_mdata =  QDF_NBUF_CB_RX_PEER_ID(nbuf);
-		peer_id = DP_PEER_METADATA_PEER_ID_GET(peer_mdata);
+		peer_id =  QDF_NBUF_CB_RX_PEER_ID(nbuf);
 		peer = dp_peer_find_by_id(soc, peer_id);
 
 		if (peer) {
@@ -2003,13 +2011,6 @@ done:
 
 		rx_bufs_used++;
 
-		if (deliver_list_head && peer && (vdev != peer->vdev)) {
-			dp_rx_deliver_to_stack(vdev, peer, deliver_list_head,
-					deliver_list_tail);
-			deliver_list_head = NULL;
-			deliver_list_tail = NULL;
-		}
-
 		if (qdf_likely(peer)) {
 			vdev = peer->vdev;
 		} else {

+ 2 - 2
dp/wifi3.0/dp_rx.h

@@ -47,14 +47,14 @@
 
 #define DP_PEER_METADATA_PEER_ID_MASK	0x0000ffff
 #define DP_PEER_METADATA_PEER_ID_SHIFT	0
-#define DP_PEER_METADATA_VDEV_ID_MASK	0x00070000
+#define DP_PEER_METADATA_VDEV_ID_MASK	0x003f0000
 #define DP_PEER_METADATA_VDEV_ID_SHIFT	16
 
 #define DP_PEER_METADATA_PEER_ID_GET(_peer_metadata)		\
 	(((_peer_metadata) & DP_PEER_METADATA_PEER_ID_MASK)	\
 			>> DP_PEER_METADATA_PEER_ID_SHIFT)
 
-#define DP_PEER_METADATA_ID_GET(_peer_metadata)			\
+#define DP_PEER_METADATA_VDEV_ID_GET(_peer_metadata)		\
 	(((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK)	\
 			>> DP_PEER_METADATA_VDEV_ID_SHIFT)
 

+ 20 - 25
qdf/linux/src/i_qdf_nbuf.h

@@ -104,24 +104,24 @@ typedef union {
  * @rx.dev.priv_cb_w.protocol_tag: protocol tag set by app for rcvd packet type
  * @rx.dev.priv_cb_w.flow_tag: flow tag set by application for 5 tuples rcvd
  *
+ * @rx.dev.priv_cb_m.peer_cached_buf_frm: peer cached buffer
+ * @rx.dev.priv_cb_m.flush_ind: flush indication
+ * @rx.dev.priv_cb_m.packet_buf_pool:  packet buff bool
  * @rx.dev.priv_cb_m.tcp_seq_num: TCP sequence number
  * @rx.dev.priv_cb_m.tcp_ack_num: TCP ACK number
  * @rx.dev.priv_cb_m.lro_ctx: LRO context
  * @rx.dev.priv_cb_m.dp.wifi3.msdu_len: length of RX packet
  * @rx.dev.priv_cb_m.dp.wifi3.peer_id:  peer_id for RX packet
  * @rx.dev.priv_cb_m.dp.wifi2.map_index:
- * @rx.dev.priv_cb_m.vdev_id: vdev_id for RX pkt
  * @rx.dev.priv_cb_m.ipa_owned: packet owned by IPA
  *
  * @rx.lro_eligible: flag to indicate whether the MSDU is LRO eligible
- * @rx.peer_cached_buf_frm: peer cached buffer
  * @rx.tcp_proto: L4 protocol is TCP
  * @rx.tcp_pure_ack: A TCP ACK packet with no payload
  * @rx.ipv6_proto: L3 protocol is IPV6
  * @rx.ip_offset: offset to IP header
  * @rx.tcp_offset: offset to TCP header
  * @rx_ctx_id: Rx context id
- * @flush_ind: flush indication
  * @num_elements_in_list: number of elements in the nbuf list
  *
  * @rx.tcp_udp_chksum: L4 payload checksum
@@ -132,7 +132,7 @@ typedef union {
  * @rx.flag_chfrag_start: first MSDU in an AMSDU
  * @rx.flag_chfrag_cont: middle or part of MSDU in an AMSDU
  * @rx.flag_chfrag_end: last MSDU in an AMSDU
- * @rx.packet_buff_pool: indicate packet from pre-allocated pool for Rx ring
+ * @rx.flag_retry: flag to indicate MSDU is retried
  * @rx.flag_da_mcbc: flag to indicate mulicast or broadcast packets
  * @rx.flag_da_valid: flag to indicate DA is valid for RX packet
  * @rx.flag_sa_valid: flag to indicate SA is valid for RX packet
@@ -146,12 +146,12 @@ typedef union {
  * @rx.trace.packet_track: RX_DATA packet
  * @rx.trace.rsrvd: enable packet logging
  *
- * @rx.ftype: mcast2ucast, TSO, SG, MESH
+ * @rx.vdev_id: vdev_id for RX pkt
  * @rx.is_raw_frame: RAW frame
  * @rx.fcs_err: FCS error
  * @rx.tid_val: tid value
- * @rx.flag_retry: flag to indicate MSDU is retried
  * @rx.reserved: reserved
+ * @rx.ftype: mcast2ucast, TSO, SG, MESH
  *
  * @tx.dev.priv_cb_w.fctx: ctx to handle special pkts defined by ftype
  * @tx.dev.priv_cb_w.ext_cb_ptr: extended cb pointer
@@ -219,9 +219,11 @@ struct qdf_nbuf_cb {
 					 * Do not change location of this bit.
 					 */
 					uint32_t ipa_owned:1,
-						 reserved:15,
-						 vdev_id:8,
-						 reserved1:8;
+						 peer_cached_buf_frm:1,
+						 flush_ind:1,
+						 packet_buf_pool:1,
+						 reserved:12,
+						 reserved1:16;
 					uint32_t tcp_seq_num;
 					uint32_t tcp_ack_num;
 					union {
@@ -237,14 +239,14 @@ struct qdf_nbuf_cb {
 				} priv_cb_m;
 			} dev;
 			uint32_t lro_eligible:1,
-				peer_cached_buf_frm:1,
+				is_raw_frame:1,
 				tcp_proto:1,
 				tcp_pure_ack:1,
 				ipv6_proto:1,
 				ip_offset:7,
 				tcp_offset:7,
 				rx_ctx_id:4,
-				flush_ind:1,
+				fcs_err:1,
 				num_elements_in_list:8;
 			uint32_t tcp_udp_chksum:16,
 				 tcp_win:16;
@@ -252,7 +254,7 @@ struct qdf_nbuf_cb {
 			uint8_t flag_chfrag_start:1,
 				flag_chfrag_cont:1,
 				flag_chfrag_end:1,
-				packet_buff_pool:1,
+				flag_retry:1,
 				flag_da_mcbc:1,
 				flag_da_valid:1,
 				flag_sa_valid:1,
@@ -263,12 +265,9 @@ struct qdf_nbuf_cb {
 					packet_track:4,
 					rsrvd:3;
 			} trace;
-			uint8_t ftype;
-			uint8_t is_raw_frame:1,
-				fcs_err:1,
-				tid_val:4,
-				flag_retry:1,
-				reserved:1;
+			uint16_t vdev_id:8,
+				 tid_val:4,
+				 ftype:4;
 		} rx;
 
 		/* Note: MAX: 40 bytes */
@@ -347,8 +346,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
 
 #define QDF_NBUF_CB_RX_LRO_ELIGIBLE(skb) \
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.lro_eligible)
-#define QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb) \
-	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.peer_cached_buf_frm)
 #define QDF_NBUF_CB_RX_TCP_PROTO(skb) \
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_proto)
 #define QDF_NBUF_CB_RX_TCP_PURE_ACK(skb) \
@@ -361,8 +358,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.tcp_offset)
 #define QDF_NBUF_CB_RX_CTX_ID(skb) \
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.rx_ctx_id)
-#define QDF_NBUF_CB_RX_FLUSH_IND(skb) \
-		(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.flush_ind)
 #define QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(skb) \
 		(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.num_elements_in_list)
 
@@ -382,6 +377,9 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
 #define QDF_NBUF_CB_RX_FTYPE(skb) \
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.ftype)
 
+#define QDF_NBUF_CB_RX_VDEV_ID(skb) \
+	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.vdev_id)
+
 #define QDF_NBUF_CB_RX_CHFRAG_START(skb) \
 	(((struct qdf_nbuf_cb *) \
 	((skb)->cb))->u.rx.flag_chfrag_start)
@@ -391,9 +389,6 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size,
 #define QDF_NBUF_CB_RX_CHFRAG_END(skb) \
 		(((struct qdf_nbuf_cb *) \
 		((skb)->cb))->u.rx.flag_chfrag_end)
-#define QDF_NBUF_CB_RX_PACKET_BUFF_POOL(skb) \
-		(((struct qdf_nbuf_cb *) \
-		((skb)->cb))->u.rx.packet_buff_pool)
 
 #define QDF_NBUF_CB_RX_DA_MCBC(skb) \
 	(((struct qdf_nbuf_cb *) \

+ 11 - 3
qdf/linux/src/i_qdf_nbuf_m.h

@@ -34,9 +34,6 @@
 #define QDF_NBUF_CB_RX_LRO_CTX(skb) \
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.lro_ctx)
 
-#define QDF_NBUF_CB_RX_VDEV_ID(skb) \
-	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.vdev_id)
-
 #define QDF_NBUF_CB_TX_IPA_OWNED(skb) \
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.tx.dev.priv_cb_m.ipa.owned)
 #define QDF_NBUF_CB_TX_IPA_PRIV(skb) \
@@ -61,6 +58,17 @@
 	(((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.dp. \
 	wifi2.map_index)
 
+#define  QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb) \
+	 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
+	 peer_cached_buf_frm)
+
+#define  QDF_NBUF_CB_RX_FLUSH_IND(skb) \
+	 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m.flush_ind)
+
+#define  QDF_NBUF_CB_RX_PACKET_BUFF_POOL(skb) \
+	 (((struct qdf_nbuf_cb *)((skb)->cb))->u.rx.dev.priv_cb_m. \
+	 packet_buf_pool)
+
 #define __qdf_nbuf_ipa_owned_get(skb) \
 	QDF_NBUF_CB_TX_IPA_OWNED(skb)