From: Leon Romanovsky <leon@kernel.org>
To: Tony Nguyen <anthony.l.nguyen@intel.com>
Cc: davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com,
edumazet@google.com, netdev@vger.kernel.org,
Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>,
sasha.neftin@intel.com, richardcochran@gmail.com,
Tan Tee Min <tee.min.tan@linux.intel.com>,
Chwee Lin Choong <chwee.lin.choong@intel.com>,
Naama Meir <naamax.meir@linux.intel.com>
Subject: Re: [PATCH net 3/6] igc: Fix TX Hang issue when QBV Gate is closed
Date: Thu, 6 Jul 2023 10:56:21 +0300 [thread overview]
Message-ID: <20230706075621.GS6455@unreal> (raw)
In-Reply-To: <20230705201905.49570-4-anthony.l.nguyen@intel.com>
On Wed, Jul 05, 2023 at 01:19:02PM -0700, Tony Nguyen wrote:
> From: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>
>
> If a user schedules a Gate Control List (GCL) to close one of
> the QBV gates while also transmitting a packet to that closed gate,
> TX Hang will be happen. HW would not drop any packet when the gate
> is closed and keep queuing up in HW TX FIFO until the gate is re-opened.
> This patch implements the solution to drop the packet for the closed
> gate.
>
> This patch will also reset the adapter to perform SW initialization
> for each 1st Gate Control List (GCL) to avoid hang.
> This is due to the HW design, where changing to TSN transmit mode
> requires SW initialization. Intel Discrete I225/6 transmit mode
> cannot be changed when in dynamic mode according to Software User
> Manual Section 7.5.2.1. Subsequent Gate Control List (GCL) operations
> will proceed without a reset, as they already are in TSN Mode.
>
> Step to reproduce:
>
> DUT:
> 1) Configure GCL List with certain gate close.
>
> BASE=$(date +%s%N)
> tc qdisc replace dev $IFACE parent root handle 100 taprio \
> num_tc 4 \
> map 0 1 2 3 3 3 3 3 3 3 3 3 3 3 3 3 \
> queues 1@0 1@1 1@2 1@3 \
> base-time $BASE \
> sched-entry S 0x8 500000 \
> sched-entry S 0x4 500000 \
> flags 0x2
>
> 2) Transmit the packet to closed gate. You may use udp_tai
> application to transmit UDP packet to any of the closed gate.
>
> ./udp_tai -i <interface> -P 100000 -p 90 -c 1 -t <0/1> -u 30004
>
> Fixes: ec50a9d437f0 ("igc: Add support for taprio offloading")
> Co-developed-by: Tan Tee Min <tee.min.tan@linux.intel.com>
> Signed-off-by: Tan Tee Min <tee.min.tan@linux.intel.com>
> Tested-by: Chwee Lin Choong <chwee.lin.choong@intel.com>
> Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>
> Tested-by: Naama Meir <naamax.meir@linux.intel.com>
> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
> ---
> drivers/net/ethernet/intel/igc/igc.h | 6 +++
> drivers/net/ethernet/intel/igc/igc_main.c | 58 +++++++++++++++++++++--
> drivers/net/ethernet/intel/igc/igc_tsn.c | 41 ++++++++++------
> 3 files changed, 87 insertions(+), 18 deletions(-)
<...>
> @@ -6149,6 +6157,8 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter,
> adapter->cycle_time = qopt->cycle_time;
> adapter->base_time = qopt->base_time;
>
> + igc_ptp_read(adapter, &now);
> +
> for (n = 0; n < qopt->num_entries; n++) {
> struct tc_taprio_sched_entry *e = &qopt->entries[n];
>
> @@ -6183,7 +6193,10 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter,
> ring->start_time = start_time;
> ring->end_time = end_time;
>
> - queue_configured[i] = true;
> + if (ring->start_time >= adapter->cycle_time)
> + queue_configured[i] = false;
> + else
> + queue_configured[i] = true;
> }
>
> start_time += e->interval;
> @@ -6193,8 +6206,20 @@ static int igc_save_qbv_schedule(struct igc_adapter *adapter,
> * If not, set the start and end time to be end time.
> */
> for (i = 0; i < adapter->num_tx_queues; i++) {
> + struct igc_ring *ring = adapter->tx_ring[i];
> +
> + if (!is_base_time_past(qopt->base_time, &now)) {
> + ring->admin_gate_closed = false;
> + } else {
> + ring->oper_gate_closed = false;
> + ring->admin_gate_closed = false;
> + }
> +
> if (!queue_configured[i]) {
> - struct igc_ring *ring = adapter->tx_ring[i];
> + if (!is_base_time_past(qopt->base_time, &now))
> + ring->admin_gate_closed = true;
> + else
> + ring->oper_gate_closed = true;
>
> ring->start_time = end_time;
> ring->end_time = end_time;
> @@ -6575,6 +6600,27 @@ static const struct xdp_metadata_ops igc_xdp_metadata_ops = {
> .xmo_rx_timestamp = igc_xdp_rx_timestamp,
> };
>
> +static enum hrtimer_restart igc_qbv_scheduling_timer(struct hrtimer *timer)
> +{
> + struct igc_adapter *adapter = container_of(timer, struct igc_adapter,
> + hrtimer);
> + unsigned int i;
> +
> + adapter->qbv_transition = true;
> + for (i = 0; i < adapter->num_tx_queues; i++) {
> + struct igc_ring *tx_ring = adapter->tx_ring[i];
> +
> + if (tx_ring->admin_gate_closed) {
Doesn't asynchronic access to shared variable through hrtimer require some sort of locking?
Thanks
> + tx_ring->admin_gate_closed = false;
> + tx_ring->oper_gate_closed = true;
> + } else {
> + tx_ring->oper_gate_closed = false;
> + }
> + }
> + adapter->qbv_transition = false;
> + return HRTIMER_NORESTART;
> +}
> +
next prev parent reply other threads:[~2023-07-06 7:56 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-05 20:18 [PATCH net 0/6][pull request] Intel Wired LAN Driver Updates 2023-07-05 (igc) Tony Nguyen
2023-07-05 20:19 ` [PATCH net 1/6] igc: Add condition for qbv_config_change_errors counter Tony Nguyen
2023-07-05 20:19 ` [PATCH net 2/6] igc: Remove delay during TX ring configuration Tony Nguyen
2023-07-05 20:19 ` [PATCH net 3/6] igc: Fix TX Hang issue when QBV Gate is closed Tony Nguyen
2023-07-06 7:56 ` Leon Romanovsky [this message]
2023-07-06 12:43 ` Zulkifli, Muhammad Husaini
2023-07-06 16:40 ` Leon Romanovsky
2023-07-07 7:39 ` Zulkifli, Muhammad Husaini
2023-07-05 20:19 ` [PATCH net 4/6] igc: set TP bit in 'supported' and 'advertising' fields of ethtool_link_ksettings Tony Nguyen
2023-07-05 20:19 ` [PATCH net 5/6] igc: Include the length/type field and VLAN tag in queueMaxSDU Tony Nguyen
2023-07-05 20:19 ` [PATCH net 6/6] igc: Handle PPS start time programming for past time values Tony Nguyen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230706075621.GS6455@unreal \
--to=leon@kernel.org \
--cc=anthony.l.nguyen@intel.com \
--cc=chwee.lin.choong@intel.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=muhammad.husaini.zulkifli@intel.com \
--cc=naamax.meir@linux.intel.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=richardcochran@gmail.com \
--cc=sasha.neftin@intel.com \
--cc=tee.min.tan@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.