This series contains updates to gtp and ice driver.
Wojciech fixes smatch reported inconsistent indenting for gtp and ice.
Yang Yingliang fixes a couple of return value checks for GNSS to IS_PTR instead of null.
Jacob adds support for trace events on tx timestamps.
The following are changes since commit 49045b9c810cd9b4ac5f8f235ad8ef17553a00fa: Merge branch 'mediatek-next' and are available in the git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue 100GbE
Jacob Keller (1): ice: add trace events for tx timestamps
Wojciech Drewek (2): gtp: Fix inconsistent indenting ice: Fix inconsistent indenting in ice_switch
Yang Yingliang (1): ice: fix return value check in ice_gnss.c
drivers/net/ethernet/intel/ice/ice_gnss.c | 4 ++-- drivers/net/ethernet/intel/ice/ice_ptp.c | 8 +++++++ drivers/net/ethernet/intel/ice/ice_switch.c | 2 +- drivers/net/ethernet/intel/ice/ice_trace.h | 24 +++++++++++++++++++++ drivers/net/gtp.c | 2 +- 5 files changed, 36 insertions(+), 4 deletions(-)
From: Yang Yingliang yangyingliang@huawei.com
kthread_create_worker() and tty_alloc_driver() return ERR_PTR() and never return NULL. The NULL test in the return value check should be replaced with IS_ERR().
Fixes: 43113ff73453 ("ice: add TTY for GNSS module for E810T device") Reported-by: Hulk Robot hulkci@huawei.com Signed-off-by: Yang Yingliang yangyingliang@huawei.com Tested-by: Gurucharan gurucharanx.g@intel.com (A Contingent worker at Intel) Signed-off-by: Tony Nguyen anthony.l.nguyen@intel.com --- drivers/net/ethernet/intel/ice/ice_gnss.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_gnss.c b/drivers/net/ethernet/intel/ice/ice_gnss.c index 755e1580f368..35579cf4283f 100644 --- a/drivers/net/ethernet/intel/ice/ice_gnss.c +++ b/drivers/net/ethernet/intel/ice/ice_gnss.c @@ -125,7 +125,7 @@ static struct gnss_serial *ice_gnss_struct_init(struct ice_pf *pf) * writes. */ kworker = kthread_create_worker(0, "ice-gnss-%s", dev_name(dev)); - if (!kworker) { + if (IS_ERR(kworker)) { kfree(gnss); return NULL; } @@ -253,7 +253,7 @@ static struct tty_driver *ice_gnss_create_tty_driver(struct ice_pf *pf) int err;
tty_driver = tty_alloc_driver(1, TTY_DRIVER_REAL_RAW); - if (!tty_driver) { + if (IS_ERR(tty_driver)) { dev_err(ice_pf_to_dev(pf), "Failed to allocate memory for GNSS TTY\n"); return NULL; }
From: Wojciech Drewek wojciech.drewek@intel.com
Fix the following warning as reported by smatch:
New smatch warnings: drivers/net/gtp.c:1796 gtp_genl_send_echo_req() warn: inconsistent indenting
Fixes: d33bd757d362 ("gtp: Implement GTP echo request") Reported-by: kernel test robot lkp@intel.com Signed-off-by: Wojciech Drewek wojciech.drewek@intel.com Signed-off-by: Tony Nguyen anthony.l.nguyen@intel.com --- drivers/net/gtp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c index 756714d4ad92..a208e2b1a9af 100644 --- a/drivers/net/gtp.c +++ b/drivers/net/gtp.c @@ -1793,7 +1793,7 @@ static int gtp_genl_send_echo_req(struct sk_buff *skb, struct genl_info *info) if (IS_ERR(rt)) { netdev_dbg(gtp->dev, "no route for echo request to %pI4\n", &dst_ip); - kfree_skb(skb_to_send); + kfree_skb(skb_to_send); return -ENODEV; }
From: Wojciech Drewek wojciech.drewek@intel.com
Fix the following warning as reported by smatch:
New smatch warnings: drivers/net/ethernet/intel/ice/ice_switch.c:5568 ice_find_dummy_packet() warn: inconsistent indenting
Fixes: 9a225f81f540 ("ice: Support GTP-U and GTP-C offload in switchdev") Reported-by: kernel test robot lkp@intel.com Signed-off-by: Wojciech Drewek wojciech.drewek@intel.com Signed-off-by: Tony Nguyen anthony.l.nguyen@intel.com --- drivers/net/ethernet/intel/ice/ice_switch.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_switch.c b/drivers/net/ethernet/intel/ice/ice_switch.c index 7f3d97595890..25b8f6f726eb 100644 --- a/drivers/net/ethernet/intel/ice/ice_switch.c +++ b/drivers/net/ethernet/intel/ice/ice_switch.c @@ -5565,7 +5565,7 @@ ice_find_dummy_packet(struct ice_adv_lkup_elem *lkups, u16 lkups_cnt, *offsets = dummy_ipv6_gtpu_ipv4_udp_packet_offsets; } else { *pkt = dummy_ipv6_gtpu_ipv4_tcp_packet; - *pkt_len = sizeof(dummy_ipv6_gtpu_ipv4_tcp_packet); + *pkt_len = sizeof(dummy_ipv6_gtpu_ipv4_tcp_packet); *offsets = dummy_ipv6_gtpu_ipv4_tcp_packet_offsets; } }
From: Jacob Keller jacob.e.keller@intel.com
We've previously run into many issues related to the latency of a Tx timestamp completion with the ice hardware. It can be difficult to determine the root cause of a slow Tx timestamp. To aid in this, introduce new trace events which capture timing data about when the driver reaches certain points while processing a transmit timestamp
* ice_tx_tstamp_request: Trace when the stack initiates a new timestamp request.
* ice_tx_tstamp_fw_req: Trace when the driver begins a read of the timestamp register in the work thread.
* ice_tx_tstamp_fw_done: Trace when the driver finishes reading a timestamp register in the work thread.
* ice_tx_tstamp_complete: Trace when the driver submits the skb back to the stack with a completed Tx timestamp.
These trace events can be enabled using the standard trace event subsystem exposed by the ice driver. If they are disabled, they become no-ops with no run time cost.
The following is a simple GNU AWK script which can highlight one potential way to use the trace events to capture latency data from the trace buffer about how long the driver takes to process a timestamp:
----- BEGIN { PREC=256 }
# Detect requests /tx_tstamp_request/ { time=strtonum($4) skb=$7
# Store the time of request for this skb requests[skb] = time printf("skb %s: idx %d at %.6f\n", skb, idx, time) }
# Detect completions /tx_tstamp_complete/ { time=strtonum($4) skb=$7 idx=$9
if (skb in requests) { latency = (time - requests[skb]) * 1000 printf("skb %s: %.3f to complete\n", skb, latency) if (latency > 4) { printf(">>> HIGH LATENCY <<<\n") } printf("\n") } else { printf("!!! skb %s (idx %d) at %.6f\n", skb, idx, time) } } -----
Signed-off-by: Jacob Keller jacob.e.keller@intel.com Tested-by: Gurucharan gurucharanx.g@intel.com (A Contingent worker at Intel) Signed-off-by: Tony Nguyen anthony.l.nguyen@intel.com --- drivers/net/ethernet/intel/ice/ice_ptp.c | 8 ++++++++ drivers/net/ethernet/intel/ice/ice_trace.h | 24 ++++++++++++++++++++++ 2 files changed, 32 insertions(+)
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c index 000c39d163a2..a1cd33273ca4 100644 --- a/drivers/net/ethernet/intel/ice/ice_ptp.c +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c @@ -3,6 +3,7 @@
#include "ice.h" #include "ice_lib.h" +#include "ice_trace.h"
#define E810_OUT_PROP_DELAY_NS 1
@@ -2063,11 +2064,15 @@ static void ice_ptp_tx_tstamp_work(struct kthread_work *work) struct sk_buff *skb; int err;
+ ice_trace(tx_tstamp_fw_req, tx->tstamps[idx].skb, idx); + err = ice_read_phy_tstamp(hw, tx->quad, phy_idx, &raw_tstamp); if (err) continue;
+ ice_trace(tx_tstamp_fw_done, tx->tstamps[idx].skb, idx); + /* Check if the timestamp is invalid or stale */ if (!(raw_tstamp & ICE_PTP_TS_VALID) || raw_tstamp == tx->tstamps[idx].cached_tstamp) @@ -2093,6 +2098,8 @@ static void ice_ptp_tx_tstamp_work(struct kthread_work *work) tstamp = ice_ptp_extend_40b_ts(pf, raw_tstamp); shhwtstamps.hwtstamp = ns_to_ktime(tstamp);
+ ice_trace(tx_tstamp_complete, skb, idx); + skb_tstamp_tx(skb, &shhwtstamps); dev_kfree_skb_any(skb); } @@ -2131,6 +2138,7 @@ s8 ice_ptp_request_ts(struct ice_ptp_tx *tx, struct sk_buff *skb) tx->tstamps[idx].start = jiffies; tx->tstamps[idx].skb = skb_get(skb); skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; + ice_trace(tx_tstamp_request, skb, idx); }
spin_unlock(&tx->lock); diff --git a/drivers/net/ethernet/intel/ice/ice_trace.h b/drivers/net/ethernet/intel/ice/ice_trace.h index cf685247c07a..ae98d5a8ff60 100644 --- a/drivers/net/ethernet/intel/ice/ice_trace.h +++ b/drivers/net/ethernet/intel/ice/ice_trace.h @@ -216,6 +216,30 @@ DEFINE_EVENT(ice_xmit_template, name, \ DEFINE_XMIT_TEMPLATE_OP_EVENT(ice_xmit_frame_ring); DEFINE_XMIT_TEMPLATE_OP_EVENT(ice_xmit_frame_ring_drop);
+DECLARE_EVENT_CLASS(ice_tx_tstamp_template, + TP_PROTO(struct sk_buff *skb, int idx), + + TP_ARGS(skb, idx), + + TP_STRUCT__entry(__field(void *, skb) + __field(int, idx)), + + TP_fast_assign(__entry->skb = skb; + __entry->idx = idx;), + + TP_printk("skb %pK idx %d", + __entry->skb, __entry->idx) +); +#define DEFINE_TX_TSTAMP_OP_EVENT(name) \ +DEFINE_EVENT(ice_tx_tstamp_template, name, \ + TP_PROTO(struct sk_buff *skb, int idx), \ + TP_ARGS(skb, idx)) + +DEFINE_TX_TSTAMP_OP_EVENT(ice_tx_tstamp_request); +DEFINE_TX_TSTAMP_OP_EVENT(ice_tx_tstamp_fw_req); +DEFINE_TX_TSTAMP_OP_EVENT(ice_tx_tstamp_fw_done); +DEFINE_TX_TSTAMP_OP_EVENT(ice_tx_tstamp_complete); + /* End tracepoints */
#endif /* _ICE_TRACE_H_ */
-----Original Message----- From: Nguyen, Anthony L anthony.l.nguyen@intel.com Sent: Wednesday, March 16, 2022 1:40 PM To: davem@davemloft.net; kuba@kernel.org; pabeni@redhat.com Cc: Keller, Jacob E jacob.e.keller@intel.com; netdev@vger.kernel.org; Nguyen, Anthony L anthony.l.nguyen@intel.com; Drewek, Wojciech wojciech.drewek@intel.com; pablo@netfilter.org; laforge@gnumonks.org; osmocom-net-gprs@lists.osmocom.org; G, GurucharanX gurucharanx.g@intel.com Subject: [PATCH net-next 4/4] ice: add trace events for tx timestamps
From: Jacob Keller jacob.e.keller@intel.com
We've previously run into many issues related to the latency of a Tx timestamp completion with the ice hardware. It can be difficult to determine the root cause of a slow Tx timestamp. To aid in this, introduce new trace events which capture timing data about when the driver reaches certain points while processing a transmit timestamp
ice_tx_tstamp_request: Trace when the stack initiates a new timestamp request.
ice_tx_tstamp_fw_req: Trace when the driver begins a read of the timestamp register in the work thread.
ice_tx_tstamp_fw_done: Trace when the driver finishes reading a timestamp register in the work thread.
ice_tx_tstamp_complete: Trace when the driver submits the skb back to the stack with a completed Tx timestamp.
These trace events can be enabled using the standard trace event subsystem exposed by the ice driver. If they are disabled, they become no-ops with no run time cost.
The following is a simple GNU AWK script which can highlight one potential way to use the trace events to capture latency data from the trace buffer about how long the driver takes to process a timestamp:
BEGIN { PREC=256 }
Another engineer recently asked me about this script so I wanted to clarify here: this is a GNU awk script intended to be invoked with "gawk -f <script>". It relies on the trace events already being enabled and that it is reading the trace (or trace_pipe) file as its standard input.
Thanks, Jake
# Detect requests /tx_tstamp_request/ { time=strtonum($4) skb=$7
# Store the time of request for this skb requests[skb] = time printf("skb %s: idx %d at %.6f\n", skb, idx, time)}
# Detect completions /tx_tstamp_complete/ { time=strtonum($4) skb=$7 idx=$9
if (skb in requests) { latency = (time - requests[skb]) * 1000 printf("skb %s: %.3f to complete\n", skb, latency) if (latency > 4) { printf(">>> HIGH LATENCY <<<\n") } printf("\n") } else { printf("!!! skb %s (idx %d) at %.6f\n", skb, idx, time) }}
Signed-off-by: Jacob Keller jacob.e.keller@intel.com Tested-by: Gurucharan gurucharanx.g@intel.com (A Contingent worker at Intel) Signed-off-by: Tony Nguyen anthony.l.nguyen@intel.com
drivers/net/ethernet/intel/ice/ice_ptp.c | 8 ++++++++ drivers/net/ethernet/intel/ice/ice_trace.h | 24 ++++++++++++++++++++++ 2 files changed, 32 insertions(+)
diff --git a/drivers/net/ethernet/intel/ice/ice_ptp.c b/drivers/net/ethernet/intel/ice/ice_ptp.c index 000c39d163a2..a1cd33273ca4 100644 --- a/drivers/net/ethernet/intel/ice/ice_ptp.c +++ b/drivers/net/ethernet/intel/ice/ice_ptp.c @@ -3,6 +3,7 @@
#include "ice.h" #include "ice_lib.h" +#include "ice_trace.h"
#define E810_OUT_PROP_DELAY_NS 1
@@ -2063,11 +2064,15 @@ static void ice_ptp_tx_tstamp_work(struct kthread_work *work) struct sk_buff *skb; int err;
ice_trace(tx_tstamp_fw_req, tx->tstamps[idx].skb, idx);err = ice_read_phy_tstamp(hw, tx->quad, phy_idx, &raw_tstamp); if (err) continue;
ice_trace(tx_tstamp_fw_done, tx->tstamps[idx].skb, idx);/* Check if the timestamp is invalid or stale */ if (!(raw_tstamp & ICE_PTP_TS_VALID) || raw_tstamp == tx->tstamps[idx].cached_tstamp)
@@ -2093,6 +2098,8 @@ static void ice_ptp_tx_tstamp_work(struct kthread_work *work) tstamp = ice_ptp_extend_40b_ts(pf, raw_tstamp); shhwtstamps.hwtstamp = ns_to_ktime(tstamp);
ice_trace(tx_tstamp_complete, skb, idx);- skb_tstamp_tx(skb, &shhwtstamps); dev_kfree_skb_any(skb); }
@@ -2131,6 +2138,7 @@ s8 ice_ptp_request_ts(struct ice_ptp_tx *tx, struct sk_buff *skb) tx->tstamps[idx].start = jiffies; tx->tstamps[idx].skb = skb_get(skb); skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
ice_trace(tx_tstamp_request, skb, idx);}
spin_unlock(&tx->lock);
diff --git a/drivers/net/ethernet/intel/ice/ice_trace.h b/drivers/net/ethernet/intel/ice/ice_trace.h index cf685247c07a..ae98d5a8ff60 100644 --- a/drivers/net/ethernet/intel/ice/ice_trace.h +++ b/drivers/net/ethernet/intel/ice/ice_trace.h @@ -216,6 +216,30 @@ DEFINE_EVENT(ice_xmit_template, name, \ DEFINE_XMIT_TEMPLATE_OP_EVENT(ice_xmit_frame_ring); DEFINE_XMIT_TEMPLATE_OP_EVENT(ice_xmit_frame_ring_drop);
+DECLARE_EVENT_CLASS(ice_tx_tstamp_template,
TP_PROTO(struct sk_buff *skb, int idx),TP_ARGS(skb, idx),TP_STRUCT__entry(__field(void *, skb)__field(int, idx)),TP_fast_assign(__entry->skb = skb;__entry->idx = idx;),TP_printk("skb %pK idx %d",__entry->skb, __entry->idx)+); +#define DEFINE_TX_TSTAMP_OP_EVENT(name) \ +DEFINE_EVENT(ice_tx_tstamp_template, name, \
TP_PROTO(struct sk_buff *skb, int idx), \TP_ARGS(skb, idx))+DEFINE_TX_TSTAMP_OP_EVENT(ice_tx_tstamp_request); +DEFINE_TX_TSTAMP_OP_EVENT(ice_tx_tstamp_fw_req); +DEFINE_TX_TSTAMP_OP_EVENT(ice_tx_tstamp_fw_done); +DEFINE_TX_TSTAMP_OP_EVENT(ice_tx_tstamp_complete);
/* End tracepoints */
#endif /* _ICE_TRACE_H_ */
2.31.1
Hello:
This series was applied to netdev/net-next.git (master) by Tony Nguyen anthony.l.nguyen@intel.com:
On Wed, 16 Mar 2022 13:40:20 -0700 you wrote:
This series contains updates to gtp and ice driver.
Wojciech fixes smatch reported inconsistent indenting for gtp and ice.
Yang Yingliang fixes a couple of return value checks for GNSS to IS_PTR instead of null.
[...]
Here is the summary with links: - [net-next,1/4] gtp: Fix inconsistent indenting https://git.kernel.org/netdev/net-next/c/02f393381d14 - [net-next,2/4] ice: Fix inconsistent indenting in ice_switch https://git.kernel.org/netdev/net-next/c/2bcd5b9f357d - [net-next,3/4] ice: fix return value check in ice_gnss.c https://git.kernel.org/netdev/net-next/c/2b1d0a242a00 - [net-next,4/4] ice: add trace events for tx timestamps https://git.kernel.org/netdev/net-next/c/4c1202189e35
You are awesome, thank you!
osmocom-net-gprs@lists.osmocom.org