瀏覽代碼

core: Add page frame number tracking trace

This change adds the event rmnet:print_pfn.
Note that this requires the udp / tcp rx trace to be enabled.

CRs-Fixed: 3139334
Change-Id: I3a0a26f517390e9861db37eddb5700cf94d54087
Signed-off-by: Subash Abhinov Kasiviswanathan <[email protected]>
Subash Abhinov Kasiviswanathan 3 年之前
父節點
當前提交
d73083ed38
共有 2 個文件被更改,包括 62 次插入0 次删除
  1. 33 0
      core/rmnet_descriptor.c
  2. 29 0
      core/rmnet_trace.h

+ 33 - 0
core/rmnet_descriptor.c

@@ -797,6 +797,35 @@ static void rmnet_frag_partial_csum(struct sk_buff *skb,
 	skb->csum_start = (u8 *)iph + frag_desc->ip_len - skb->head;
 }
 
+#define PFN_ENTRY_MAX (256)
+#define PFNI (count++ % PFN_ENTRY_MAX)
+static void rmnet_descriptor_trace_pfn(struct sk_buff *skb)
+{
+	struct skb_shared_info *shinfo;
+	struct sk_buff *frag_iter;
+	unsigned long rpfn[PFN_ENTRY_MAX];
+	int i, count;
+
+	if (!trace_print_pfn_enabled())
+		return;
+
+	shinfo = skb_shinfo(skb);
+	memset(rpfn, 0, sizeof(rpfn));
+	count = 0;
+
+	for (i = 0; i < shinfo->nr_frags; i++)
+		rpfn[PFNI] = page_to_pfn(skb_frag_page(&shinfo->frags[i]));
+
+	skb_walk_frags(skb, frag_iter) {
+		shinfo = skb_shinfo(frag_iter);
+
+		for (i = 0; i < shinfo->nr_frags; i++)
+			rpfn[PFNI] = page_to_pfn(skb_frag_page(&shinfo->frags[i]));
+	}
+
+	trace_print_pfn(skb, rpfn, count);
+}
+
 /* Allocate and populate an skb to contain the packet represented by the
  * frag descriptor.
  */
@@ -1018,6 +1047,8 @@ skip_frags:
 		}
 
 		trace_print_tcp_rx(head_skb, saddr, daddr, tcp_hdr(head_skb));
+
+		rmnet_descriptor_trace_pfn(head_skb);
 	}
 skip_trace_print_tcp_rx:
 
@@ -1047,6 +1078,8 @@ skip_trace_print_tcp_rx:
 		}
 
 		trace_print_udp_rx(head_skb, saddr, daddr, udp_hdr(head_skb));
+
+		rmnet_descriptor_trace_pfn(head_skb);
 	}
 skip_trace_print_udp_rx:
 

+ 29 - 0
core/rmnet_trace.h

@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
 /* Copyright (c) 2018-2021, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2022, Qualcomm Innovation Center, Inc. All rights reserved.
  */
 #include <linux/version.h>
 #undef TRACE_SYSTEM
@@ -310,6 +311,34 @@ DEFINE_EVENT
 	TP_ARGS(skb, saddr, daddr, uh)
 );
 
+TRACE_EVENT(print_pfn,
+
+	TP_PROTO(struct sk_buff *skb, unsigned long *pfn_list, int num_elements),
+
+	TP_ARGS(skb, pfn_list, num_elements),
+
+	TP_STRUCT__entry(
+		__field(void *, skbaddr)
+		__field(int, num_elements)
+		__dynamic_array(unsigned long, pfn_list, num_elements)
+	),
+
+	TP_fast_assign(
+		__entry->skbaddr = skb;
+		__entry->num_elements = num_elements;
+		memcpy(__get_dynamic_array(pfn_list), pfn_list,
+		       num_elements * sizeof(*pfn_list));
+	),
+
+	TP_printk("skbaddr=%pK count=%d pfn=%s",
+		  __entry->skbaddr,
+		  __entry->num_elements,
+		  __print_array(__get_dynamic_array(pfn_list),
+				__entry->num_elements,
+				sizeof(unsigned long))
+	)
+);
+
 /*****************************************************************************/
 /* Trace events for rmnet_perf module */
 /*****************************************************************************/