From: Tony Nguyen <anthony.l.nguyen@intel.com>
To: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>,
<intel-wired-lan@osuosl.org>
Cc: mallikarjuna.chilakala@intel.com
Subject: Re: [Intel-wired-lan] [PATCH v1] igc: Qbv scheduling enchancement using frst flag bit
Date: Wed, 2 Nov 2022 14:27:47 -0700 [thread overview]
Message-ID: <c665240a-3cfa-4eb8-4308-63fd98492faf@intel.com> (raw)
In-Reply-To: <20221020145316.1543-1-muhammad.husaini.zulkifli@intel.com>
On 10/20/2022 7:53 AM, Muhammad Husaini Zulkifli wrote:
> From: Vinicius Costa Gomes <vinicius.gomes@intel.com>
>
> The I225 hardware has a limitation that packets can only be scheduled
> in the [0, cycle-time] interval. So, scheduling a packet to the start
> of the next cycle doesn't usually work.
>
> To overcome this, we use the Transmit Descriptor frst flag to indicates
> that a packet should be the first packet (from a queue) in a cycle
> according to the section 7.5.2.9.3.4 The First Packet on Each QBV Cycle
> in Intel Discrete I225/6 User Manual.
>
> But this only works if there was any packet from that queue during the
> current cycle, to avoid this issue, we issue an empty packet if that's
> not the case. Also require one more descriptor to be available, to take
> into account the empty packet that might be issued.
>
> Test Setup:
>
> Talker: Use l2_tai to generate the launchtime into packet load.
>
> Listener: Use timedump.c to compute the delta between packet arrival
> and LaunchTime packet payload.
>
> Test Result:
>
> Before:
>
> 1666000610127300000,1666000610127300096,96,621273
> 1666000610127400000,1666000610127400192,192,621274
> 1666000610127500000,1666000610127500032,32,621275
> 1666000610127600000,1666000610127600128,128,621276
> 1666000610127700000,1666000610127700224,224,621277
> 1666000610127800000,1666000610127800064,64,621278
> 1666000610127900000,1666000610127900160,160,621279
> 1666000610128000000,1666000610128000000,0,621280
> 1666000610128100000,1666000610128100096,96,621281
> 1666000610128200000,1666000610128200192,192,621282
> 1666000610128300000,1666000610128300032,32,621283
> 1666000610128400000,1666000610128301056,-98944,621284
> 1666000610128500000,1666000610128302080,-197920,621285
> 1666000610128600000,1666000610128302848,-297152,621286
> 1666000610128700000,1666000610128303872,-396128,621287
> 1666000610128800000,1666000610128304896,-495104,621288
> 1666000610128900000,1666000610128305664,-594336,621289
> 1666000610129000000,1666000610128306688,-693312,621290
> 1666000610129100000,1666000610128307712,-792288,621291
> 1666000610129200000,1666000610128308480,-891520,621292
> 1666000610129300000,1666000610128309504,-990496,621293
> 1666000610129400000,1666000610128310528,-1089472,621294
> 1666000610129500000,1666000610128311296,-1188704,621295
> 1666000610129600000,1666000610128312320,-1287680,621296
> 1666000610129700000,1666000610128313344,-1386656,621297
> 1666000610129800000,1666000610128314112,-1485888,621298
> 1666000610129900000,1666000610128315136,-1584864,621299
> 1666000610130000000,1666000610128316160,-1683840,621300
> 1666000610130100000,1666000610128316928,-1783072,621301
> 1666000610130200000,1666000610128317952,-1882048,621302
> 1666000610130300000,1666000610128318976,-1981024,621303
> 1666000610130400000,1666000610128319744,-2080256,621304
> 1666000610130500000,1666000610128320768,-2179232,621305
> 1666000610130600000,1666000610128321792,-2278208,621306
> 1666000610130700000,1666000610128322816,-2377184,621307
> 1666000610130800000,1666000610128323584,-2476416,621308
> 1666000610130900000,1666000610128324608,-2575392,621309
> 1666000610131000000,1666000610128325632,-2674368,621310
> 1666000610131100000,1666000610128326400,-2773600,621311
> 1666000610131200000,1666000610128327424,-2872576,621312
> 1666000610131300000,1666000610128328448,-2971552,621313
> 1666000610131400000,1666000610128329216,-3070784,621314
> 1666000610131500000,1666000610131500032,32,621315
> 1666000610131600000,1666000610131600128,128,621316
> 1666000610131700000,1666000610131700224,224,621317
>
> After:
>
> 1666073510646200000,1666073510646200064,64,2676462
> 1666073510646300000,1666073510646300160,160,2676463
> 1666073510646400000,1666073510646400256,256,2676464
> 1666073510646500000,1666073510646500096,96,2676465
> 1666073510646600000,1666073510646600192,192,2676466
> 1666073510646700000,1666073510646700032,32,2676467
> 1666073510646800000,1666073510646800128,128,2676468
> 1666073510646900000,1666073510646900224,224,2676469
> 1666073510647000000,1666073510647000064,64,2676470
> 1666073510647100000,1666073510647100160,160,2676471
> 1666073510647200000,1666073510647200256,256,2676472
> 1666073510647300000,1666073510647300096,96,2676473
> 1666073510647400000,1666073510647400192,192,2676474
> 1666073510647500000,1666073510647500032,32,2676475
> 1666073510647600000,1666073510647600128,128,2676476
> 1666073510647700000,1666073510647700224,224,2676477
> 1666073510647800000,1666073510647800064,64,2676478
> 1666073510647900000,1666073510647900160,160,2676479
> 1666073510648000000,1666073510648000000,0,2676480
> 1666073510648100000,1666073510648100096,96,2676481
> 1666073510648200000,1666073510648200192,192,2676482
> 1666073510648300000,1666073510648300032,32,2676483
> 1666073510648400000,1666073510648400128,128,2676484
> 1666073510648500000,1666073510648500224,224,2676485
> 1666073510648600000,1666073510648600064,64,2676486
> 1666073510648700000,1666073510648700160,160,2676487
> 1666073510648800000,1666073510648800000,0,2676488
> 1666073510648900000,1666073510648900096,96,2676489
> 1666073510649000000,1666073510649000192,192,2676490
> 1666073510649100000,1666073510649100032,32,2676491
> 1666073510649200000,1666073510649200128,128,2676492
> 1666073510649300000,1666073510649300224,224,2676493
> 1666073510649400000,1666073510649400064,64,2676494
> 1666073510649500000,1666073510649500160,160,2676495
> 1666073510649600000,1666073510649600000,0,2676496
> 1666073510649700000,1666073510649700096,96,2676497
> 1666073510649800000,1666073510649800192,192,2676498
> 1666073510649900000,1666073510649900032,32,2676499
> 1666073510650000000,1666073510650000128,128,2676500
>
> Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
> Co-developed-by: Aravindhan Gunasekaran <aravindhan.gunasekaran@intel.com>
> Signed-off-by: Aravindhan Gunasekaran <aravindhan.gunasekaran@intel.com>
> Co-developed-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>
> Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>
> Signed-off-by: Malli C <mallikarjuna.chilakala@intel.com>
> Signed-off-by: Muhammad Husaini Zulkifli <muhammad.husaini.zulkifli@intel.com>
Your sign off is on here twice
> ---
> drivers/net/ethernet/intel/igc/igc.h | 2 +
> drivers/net/ethernet/intel/igc/igc_defines.h | 2 +
> drivers/net/ethernet/intel/igc/igc_main.c | 185 ++++++++++++++++---
> 3 files changed, 159 insertions(+), 30 deletions(-)
>
> diff --git a/drivers/net/ethernet/intel/igc/igc.h b/drivers/net/ethernet/intel/igc/igc.h
> index 1e7e7071f64d..66a57636d329 100644
> --- a/drivers/net/ethernet/intel/igc/igc.h
> +++ b/drivers/net/ethernet/intel/igc/igc.h
> @@ -94,6 +94,8 @@ struct igc_ring {
> u8 queue_index; /* logical index of the ring*/
> u8 reg_idx; /* physical index of the ring */
> bool launchtime_enable; /* true if LaunchTime is enabled */
> + ktime_t last_tx_cycle; /* end of the cycle with a launchtime transmission */
> + ktime_t last_ff_cycle; /* Last cycle with an active first flag */
>
> u32 start_time;
> u32 end_time;
> diff --git a/drivers/net/ethernet/intel/igc/igc_defines.h b/drivers/net/ethernet/intel/igc/igc_defines.h
> index f7311aeb293b..a7b22639cfcd 100644
> --- a/drivers/net/ethernet/intel/igc/igc_defines.h
> +++ b/drivers/net/ethernet/intel/igc/igc_defines.h
> @@ -321,6 +321,8 @@
> #define IGC_ADVTXD_L4LEN_SHIFT 8 /* Adv ctxt L4LEN shift */
> #define IGC_ADVTXD_MSS_SHIFT 16 /* Adv ctxt MSS shift */
>
> +#define IGC_ADVTXD_TSN_CNTX_FIRST 0x00000080
> +
> /* Transmit Control */
> #define IGC_TCTL_EN 0x00000002 /* enable Tx */
> #define IGC_TCTL_PSP 0x00000008 /* pad short packets */
> diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
> index 671255edf3c2..28cc395c6fff 100644
> --- a/drivers/net/ethernet/intel/igc/igc_main.c
> +++ b/drivers/net/ethernet/intel/igc/igc_main.c
> @@ -1000,31 +1000,122 @@ static int igc_write_mc_addr_list(struct net_device *netdev)
> return netdev_mc_count(netdev);
> }
>
> -static __le32 igc_tx_launchtime(struct igc_adapter *adapter, ktime_t txtime)
> +static __le32 igc_tx_launchtime(struct igc_ring *ring, ktime_t txtime,
> + bool *first_flag, bool *insert_empty)
> {
> + struct igc_adapter *adapter = netdev_priv(ring->netdev);
> ktime_t cycle_time = adapter->cycle_time;
> ktime_t base_time = adapter->base_time;
> - u32 launchtime;
> + ktime_t now = ktime_get_clocktai();
> + ktime_t baset_est, end_of_cycle;
> + s64 n;
>
> - /* FIXME: when using ETF together with taprio, we may have a
> - * case where 'delta' is larger than the cycle_time, this may
> - * cause problems if we don't read the current value of
> - * IGC_BASET, as the value writen into the launchtime
> - * descriptor field may be misinterpreted.
> + n = div64_s64(ktime_sub_ns(now, base_time), cycle_time);
> +
> + baset_est = ktime_add_ns(base_time, cycle_time * (n));
> + end_of_cycle = ktime_add_ns(baset_est, cycle_time);
> +
> + if (ktime_compare(txtime, end_of_cycle) >= 0) {
> + if (baset_est != ring->last_ff_cycle) {
> + *first_flag = true;
> + ring->last_ff_cycle = baset_est;
> +
> + if (ktime_compare(txtime, ring->last_tx_cycle) > 0)
> + *insert_empty = true;
> + }
> + }
> +
> + /* Introducing a window at end of cycle on which packets
> + * potentially not honor launchtime. Window of 5us chosen
> + * considering software update the tail pointer and packets
> + * are dma'ed to packet buffer.
> */
> - div_s64_rem(ktime_sub_ns(txtime, base_time), cycle_time, &launchtime);
> + if ((ktime_sub_ns(end_of_cycle, now) < 5 * NSEC_PER_USEC)) {
> + netdev_warn(ring->netdev, "Packet with txtime=%llu may not be honoured\n",
> + txtime);
> + }
nit: These braces aren't needed
> +
> + ring->last_tx_cycle = end_of_cycle;
> +
> + txtime = ktime_sub_ns(txtime, baset_est);
> + txtime = (txtime > 0 ? txtime % cycle_time : 0);
The parentheses as well I believe
> +
> + return cpu_to_le32(txtime);
> +}
> +
> +static int igc_init_empty_frame(struct igc_ring *ring,
> + struct igc_tx_buffer *buffer,
> + struct sk_buff *skb)
> +{
> + dma_addr_t dma;
> + unsigned int size;
Please reorder to be RCT
> +
> + size = skb_headlen(skb);
> +
> + dma = dma_map_single(ring->dev, skb->data, size, DMA_TO_DEVICE);
> + if (dma_mapping_error(ring->dev, dma)) {
> + netdev_err_once(ring->netdev, "Failed to map DMA for TX\n");
> + return -ENOMEM;
> + }
> +
> + buffer->skb = skb;
> + buffer->protocol = 0;
> + buffer->bytecount = skb->len;
> + buffer->gso_segs = 1;
> + buffer->time_stamp = jiffies;
> + dma_unmap_len_set(buffer, len, skb->len);
> + dma_unmap_addr_set(buffer, dma, dma);
> +
> + return 0;
> +}
> +
> +static int igc_init_tx_empty_descriptor(struct igc_ring *ring,
> + struct sk_buff *skb,
> + struct igc_tx_buffer *first)
> +{
> + union igc_adv_tx_desc *desc;
> + u32 cmd_type, olinfo_status;
> + int err;
> +
> + if (!igc_desc_unused(ring))
> + return -EBUSY;
>
> - return cpu_to_le32(launchtime);
> + err = igc_init_empty_frame(ring, first, skb);
> + if (err)
> + return err;
> +
> + cmd_type = IGC_ADVTXD_DTYP_DATA | IGC_ADVTXD_DCMD_DEXT |
> + IGC_ADVTXD_DCMD_IFCS | IGC_TXD_DCMD |
> + first->bytecount;
> + olinfo_status = first->bytecount << IGC_ADVTXD_PAYLEN_SHIFT;
> +
> + desc = IGC_TX_DESC(ring, ring->next_to_use);
> + desc->read.cmd_type_len = cpu_to_le32(cmd_type);
> + desc->read.olinfo_status = cpu_to_le32(olinfo_status);
> + desc->read.buffer_addr = cpu_to_le64(dma_unmap_addr(first, dma));
> +
> + netdev_tx_sent_queue(txring_txq(ring), skb->len);
> +
> + first->next_to_watch = desc;
> +
> + ring->next_to_use++;
> + if (ring->next_to_use == ring->count)
> + ring->next_to_use = 0;
> +
> + return 0;
> }
>
> +#define IGC_EMPTY_FRAME_SIZE 60
> +
> static void igc_tx_ctxtdesc(struct igc_ring *tx_ring,
> - struct igc_tx_buffer *first,
> + __le32 launch_time, bool first_flag,
> u32 vlan_macip_lens, u32 type_tucmd,
> u32 mss_l4len_idx)
> {
> struct igc_adv_tx_context_desc *context_desc;
> - u16 i = tx_ring->next_to_use;
> + u16 i;
>
> + i = tx_ring->next_to_use;
What's the reason for this change?
> context_desc = IGC_TX_CTXTDESC(tx_ring, i);
>
> i++;
>
_______________________________________________
Intel-wired-lan mailing list
Intel-wired-lan@osuosl.org
https://lists.osuosl.org/mailman/listinfo/intel-wired-lan
next prev parent reply other threads:[~2022-11-02 21:27 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-20 14:53 [Intel-wired-lan] [PATCH v1] igc: Qbv scheduling enchancement using frst flag bit Muhammad Husaini Zulkifli
2022-10-20 15:08 ` Paul Menzel
2022-10-20 22:44 ` Zulkifli, Muhammad Husaini
2022-10-20 22:28 ` kernel test robot
2022-10-20 22:28 ` kernel test robot
2022-11-02 21:27 ` Tony Nguyen [this message]
2022-11-03 0:52 ` Zulkifli, Muhammad Husaini
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=c665240a-3cfa-4eb8-4308-63fd98492faf@intel.com \
--to=anthony.l.nguyen@intel.com \
--cc=intel-wired-lan@osuosl.org \
--cc=mallikarjuna.chilakala@intel.com \
--cc=muhammad.husaini.zulkifli@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox