> On Jun 20, 2019, at 10:07 AM, Eric Dumazet <eric.duma...@gmail.com> wrote:
> 
> 
> 
> On 6/20/19 9:49 AM, Patel, Vedang wrote:
>> 
>> 
>>> On Jun 20, 2019, at 3:47 AM, Eric Dumazet <eric.duma...@gmail.com> wrote:
>>> 
>>> 
>>> 
>>> On 6/19/19 10:40 AM, Vedang Patel wrote:
>>>> skb->tstamp is being used at multiple places. On the transmit side, it
>>>> is used to determine the launchtime of the packet. It is also used to
>>>> determine the software timestamp after the packet has been transmitted.
>>>> 
>>>> So, clear out the tstamp value after it has been read so that we do not
>>>> report false software timestamp on the receive side.
>>>> 
>>>> Signed-off-by: Vedang Patel <vedang.pa...@intel.com>
>>>> ---
>>>> drivers/net/ethernet/intel/igb/igb_main.c | 1 +
>>>> 1 file changed, 1 insertion(+)
>>>> 
>>>> diff --git a/drivers/net/ethernet/intel/igb/igb_main.c 
>>>> b/drivers/net/ethernet/intel/igb/igb_main.c
>>>> index fc925adbd9fa..f66dae72fe37 100644
>>>> --- a/drivers/net/ethernet/intel/igb/igb_main.c
>>>> +++ b/drivers/net/ethernet/intel/igb/igb_main.c
>>>> @@ -5688,6 +5688,7 @@ static void igb_tx_ctxtdesc(struct igb_ring *tx_ring,
>>>>     */
>>>>    if (tx_ring->launchtime_enable) {
>>>>            ts = ns_to_timespec64(first->skb->tstamp);
>>>> +          first->skb->tstamp = 0;
>>> 
>>> Please provide more explanations.
>>> 
>>> Why only this driver would need this ?
>>> 
>> Currently, igb is the only driver which uses the skb->tstamp option on the 
>> transmit side (to set the hardware transmit timestamp). All the other 
>> drivers only use it on the receive side (to collect and send the hardware 
>> transmit timestamp to the userspace after packet has been sent).
>> 
>> So, any driver which supports the hardware txtime in the future will have to 
>> clear skb->tstamp to make sure that hardware tx transmit and tx timestamping 
>> can be done on the same packet.
> 
> The changelog is rather confusing :
> 
> "So, clear out the tstamp value after it has been read so that we do not
> report false software timestamp on the receive side."
> 
> I have hard time understanding why sending an skb through this driver
> could cause a problem on receive side ?
> 
Ahh.. that’s clearly a false statement. Skb->tstamp is cleared so that it is 
not interpreted as a software timestamp when trying to send the Hardware TX 
timestamp to the userspace. I will rephrase the commit message in the next 
version.

Some more details:
The problem occurs when using the txtime-assist mode of taprio with packets 
which also request the hardware transmit timestamp (e.g. PTP packets). Whenever 
txtime-assist mode is set, taprio will assign a hardware transmit timestamp to 
all the packets (in skb->tstamp). PTP packets will also request the hardware 
transmit timestamp be sent to the userspace after packet is transmitted.

Whenever a new timestamp is detected by the driver (this work is done in 
igb_ptp_tx_work() which calls igb_ptp_tx_hwtstamps() in igb_ptp.c[1]), it will 
queue the timestamp in the ERR_QUEUE for the userspace to read. When the 
userspace is ready, it will issue a recvmsg() call to collect this timestamp. 
The problem is in this recvmsg() call. If the skb->tstamp is not cleared out, 
it will be interpreted as a software timestamp and the hardware tx timestamp 
will not be successfully sent to the userspace. Look at skb_is_swtx_tstamp() 
and the callee function __sock_recv_timestamp() in net/socket.c for more 
details. 

Thanks, 
Vedang

[1] - 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/net/ethernet/intel/igb/igb_ptp.c?h=v5.2-rc5#n666

> I suggest to rephrase it to clear the confusion.
> 
>> 
>> Thanks,
>> Vedang
>>> 
>>>>            context_desc->seqnum_seed = cpu_to_le32(ts.tv_nsec / 32);
>>>>    } else {
>>>>            context_desc->seqnum_seed = 0;
>>>> 
>> 

Reply via email to