• Jacob Keller's avatar
    ice: fix handling of burst Tx timestamps · 30f15874
    Jacob Keller authored
    Commit 1229b339 ("ice: Add low latency Tx timestamp read") refactored
    PTP timestamping logic to use a threaded IRQ instead of a separate kthread.
    
    This implementation introduced ice_misc_intr_thread_fn and redefined the
    ice_ptp_process_ts function interface to return a value of whether or not
    the timestamp processing was complete.
    
    ice_misc_intr_thread_fn would take the return value from ice_ptp_process_ts
    and convert it into either IRQ_HANDLED if there were no more timestamps to
    be processed, or IRQ_WAKE_THREAD if the thread should continue processing.
    
    This is not correct, as the kernel does not re-schedule threaded IRQ
    functions automatically. IRQ_WAKE_THREAD can only be used by the main IRQ
    function.
    
    This results in the ice_ptp_process_ts function (and in turn the
    ice_ptp_tx_tstamp function) from only being called exactly once per
    interrupt.
    
    If an application sends a burst of Tx timestamps without waiting for a
    response, the interrupt will trigger for the first timestamp. However,
    later timestamps may not have arrived yet. This can result in dropped or
    discarded timestamps. Worse, on E822 hardware this results in the interrupt
    logic getting stuck such that no future interrupts will be triggered. The
    result is complete loss of Tx timestamp functionality.
    
    Fix this by modifying the ice_misc_intr_thread_fn to perform its own
    polling of the ice_ptp_process_ts function. We sleep for a few microseconds
    between attempts to avoid wasting significant CPU time. The value was
    chosen to allow time for the Tx timestamps to complete without wasting so
    much time that we overrun application wait budgets in the worst case.
    
    The ice_ptp_process_ts function also currently returns false in the event
    that the Tx tracker is not initialized. This would result in the threaded
    IRQ handler never exiting if it gets started while the tracker is not
    initialized.
    
    Fix the function to appropriately return true when the tracker is not
    initialized.
    
    Note that this will not reproduce with default ptp4l behavior, as the
    program always synchronously waits for a timestamp response before sending
    another timestamp request.
    Reported-by: default avatarSiddaraju DH <siddaraju.dh@intel.com>
    Fixes: 1229b339 ("ice: Add low latency Tx timestamp read")
    Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
    Tested-by: Gurucharan G <gurucharanx.g@intel.com> (A Contingent worker at Intel)
    Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
    Link: https://lore.kernel.org/r/20221118222729.1565317-1-anthony.l.nguyen@intel.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    30f15874
ice_main.c 243 KB