Skip to content

Commit c0f8fca

Browse files
committed
iavf: periodically cache PHC time
JIRA: https://issues.redhat.com/browse/RHEL-83568 commit 7c01dbf Author: Jacob Keller <jacob.e.keller@intel.com> Date: Wed Nov 6 12:37:25 2024 -0500 iavf: periodically cache PHC time The Rx timestamps reported by hardware may only have 32 bits of storage for nanosecond time. These timestamps cannot be directly reported to the Linux stack, as it expects 64bits of time. To handle this, the timestamps must be extended using an algorithm that calculates the corrected 64bit timestamp by comparison between the PHC time and the timestamp. This algorithm requires the PHC time to be captured within ~2 seconds of when the timestamp was captured. Instead of trying to read the PHC time in the Rx hotpath, the algorithm relies on a cached value that is periodically updated. Keep this cached time up to date by using the PTP .do_aux_work kthread function. The iavf_ptp_do_aux_work will reschedule itself about twice a second, and will check whether or not the cached PTP time needs to be updated. If so, it issues a VIRTCHNL_OP_1588_PTP_GET_TIME to request the time from the PF. The jitter and latency involved with this command aren't important, because the cached time just needs to be kept up to date within about ~2 seconds. Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Reviewed-by: Simon Horman <horms@kernel.org> Tested-by: Rafal Romanowski <rafal.romanowski@intel.com> Co-developed-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com> Signed-off-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Signed-off-by: Michal Schmidt <mschmidt@redhat.com>
1 parent 2354bf2 commit c0f8fca

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

drivers/net/ethernet/intel/iavf/iavf_ptp.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,56 @@ static int iavf_ptp_gettimex64(struct ptp_clock_info *info,
158158
return iavf_read_phc_indirect(adapter, ts, sts);
159159
}
160160

161+
/**
162+
* iavf_ptp_cache_phc_time - Cache PHC time for performing timestamp extension
163+
* @adapter: private adapter structure
164+
*
165+
* Periodically cache the PHC time in order to allow for timestamp extension.
166+
* This is required because the Tx and Rx timestamps only contain 32bits of
167+
* nanoseconds. Timestamp extension allows calculating the corrected 64bit
168+
* timestamp. This algorithm relies on the cached time being within ~1 second
169+
* of the timestamp.
170+
*/
171+
static void iavf_ptp_cache_phc_time(struct iavf_adapter *adapter)
172+
{
173+
if (!time_is_before_jiffies(adapter->ptp.cached_phc_updated + HZ))
174+
return;
175+
176+
/* The response from virtchnl will store the time into
177+
* cached_phc_time.
178+
*/
179+
iavf_send_phc_read(adapter);
180+
}
181+
182+
/**
183+
* iavf_ptp_do_aux_work - Perform periodic work required for PTP support
184+
* @info: PTP clock info structure
185+
*
186+
* Handler to take care of periodic work required for PTP operation. This
187+
* includes the following tasks:
188+
*
189+
* 1) updating cached_phc_time
190+
*
191+
* cached_phc_time is used by the Tx and Rx timestamp flows in order to
192+
* perform timestamp extension, by carefully comparing the timestamp
193+
* 32bit nanosecond timestamps and determining the corrected 64bit
194+
* timestamp value to report to userspace. This algorithm only works if
195+
* the cached_phc_time is within ~1 second of the Tx or Rx timestamp
196+
* event. This task periodically reads the PHC time and stores it, to
197+
* ensure that timestamp extension operates correctly.
198+
*
199+
* Returns: time in jiffies until the periodic task should be re-scheduled.
200+
*/
201+
static long iavf_ptp_do_aux_work(struct ptp_clock_info *info)
202+
{
203+
struct iavf_adapter *adapter = iavf_clock_to_adapter(info);
204+
205+
iavf_ptp_cache_phc_time(adapter);
206+
207+
/* Check work about twice a second */
208+
return msecs_to_jiffies(500);
209+
}
210+
161211
/**
162212
* iavf_ptp_register_clock - Register a new PTP for userspace
163213
* @adapter: private adapter structure
@@ -176,6 +226,7 @@ static int iavf_ptp_register_clock(struct iavf_adapter *adapter)
176226
KBUILD_MODNAME, dev_name(dev));
177227
ptp_info->owner = THIS_MODULE;
178228
ptp_info->gettimex64 = iavf_ptp_gettimex64;
229+
ptp_info->do_aux_work = iavf_ptp_do_aux_work;
179230

180231
clock = ptp_clock_register(ptp_info, dev);
181232
if (IS_ERR(clock))
@@ -219,6 +270,8 @@ void iavf_ptp_init(struct iavf_adapter *adapter)
219270

220271
rx_ring->ptp = &adapter->ptp;
221272
}
273+
274+
ptp_schedule_worker(adapter->ptp.clock, 0);
222275
}
223276

224277
/**

0 commit comments

Comments
 (0)