mbox series

[v6,net-next,0/4] sfc: support unicast PTP

Message ID 20230331111404.17256-1-ihuguet@redhat.com (mailing list archive)
Headers show
Series sfc: support unicast PTP | expand

Message

Íñigo Huguet March 31, 2023, 11:14 a.m. UTC
Unicast PTP was not working with sfc NICs.

The reason was that these NICs don't timestamp all incoming packets,
but instead they only timestamp packets of the queues that are selected
for that. Currently, only one RX queue is configured for timestamp: the
RX queue of the PTP channel. The packets that are put in the PTP RX
queue are selected according to firmware filters configured from the
driver.

Multicast PTP was already working because the needed filters are known
in advance, so they're inserted when PTP is enabled. This patches
add the ability to dynamically add filters for unicast addresses,
extracted from the TX PTP-event packets.

Since we don't know in advance how many filters we'll need, some info
about the filters need to be saved. This will allow to check if a filter
already exists or if a filter is too old and should be removed.

Note that the previous point is unnecessary for multicast filters, but
I've opted to change how they're handled to match the new unicast's
filters to avoid having duplicate insert/remove_filters functions,
once for each type of filter.

Tested: With ptp4l, all combinations of IPv4/IPv6, master/slave and
unicast/multicast

Reported-by: Yalin Li <yalli@redhat.com>
Signed-off-by: Íñigo Huguet <ihuguet@redhat.com>

v2:
 - fixed missing IS_ERR
 - added doc of missing fields in efx_ptp_rxfilter
v3:
 - dropped pointless static inline in source file
 - removed the now unused PTP_RXFILTERS_LEN
 - follow reverse xmas tree convention in xmit_skb_mc
 - pass expiry as argument to the insert_filter functions and keep returning an
   integer error code from them, and not pointers, as suggested by Martin
 - moved the unicast filters expiration check to the end of the worker function
   to avoid increasing TX latency, as suggested by Martin
 - added check to avoid inserting unicast filters when doing multicast PTP
v4:
 - fixed filter leak, catched by Edward
v5: per Edward's suggestions:
 - moved local variable declaration from patch 4 to patch 2
 - changed argument variable names ptp_list for more descriptive filter_list
 - don't remove unicast filter if one insertion fails: they're still valid
 - run unicast filters cleanup in dedicated work every 30s if there are active
   filters. This avoid having to check for expiration on every PTP TX packet. It
   also allows to cleanup the filters if PTP operations have stopped.
v6:
 - added missing kdoc for work_cleanup
 - added missing +1 in queue_delayed_work delay argument

Íñigo Huguet (4):
  sfc: store PTP filters in a list
  sfc: allow insertion of filters for unicast PTP
  sfc: support unicast PTP
  sfc: remove expired unicast PTP filters

 drivers/net/ethernet/sfc/ptp.c | 274 +++++++++++++++++++++++++++------
 1 file changed, 226 insertions(+), 48 deletions(-)

--
2.39.2

Comments

Edward Cree April 3, 2023, 1:13 p.m. UTC | #1
On 31/03/2023 12:14, Íñigo Huguet wrote:
> Unicast PTP was not working with sfc NICs.
> 
> The reason was that these NICs don't timestamp all incoming packets,
> but instead they only timestamp packets of the queues that are selected
> for that. Currently, only one RX queue is configured for timestamp: the
> RX queue of the PTP channel. The packets that are put in the PTP RX
> queue are selected according to firmware filters configured from the
> driver.
> 
> Multicast PTP was already working because the needed filters are known
> in advance, so they're inserted when PTP is enabled. This patches
> add the ability to dynamically add filters for unicast addresses,
> extracted from the TX PTP-event packets.
> 
> Since we don't know in advance how many filters we'll need, some info
> about the filters need to be saved. This will allow to check if a filter
> already exists or if a filter is too old and should be removed.
> 
> Note that the previous point is unnecessary for multicast filters, but
> I've opted to change how they're handled to match the new unicast's
> filters to avoid having duplicate insert/remove_filters functions,
> once for each type of filter.
> 
> Tested: With ptp4l, all combinations of IPv4/IPv6, master/slave and
> unicast/multicast
> 
> Reported-by: Yalin Li <yalli@redhat.com>
> Signed-off-by: Íñigo Huguet <ihuguet@redhat.com>

Reviewed-by: Edward Cree <ecree.xilinx@gmail.com>
patchwork-bot+netdevbpf@kernel.org April 4, 2023, 2:10 a.m. UTC | #2
Hello:

This series was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Fri, 31 Mar 2023 13:14:00 +0200 you wrote:
> Unicast PTP was not working with sfc NICs.
> 
> The reason was that these NICs don't timestamp all incoming packets,
> but instead they only timestamp packets of the queues that are selected
> for that. Currently, only one RX queue is configured for timestamp: the
> RX queue of the PTP channel. The packets that are put in the PTP RX
> queue are selected according to firmware filters configured from the
> driver.
> 
> [...]

Here is the summary with links:
  - [v6,net-next,1/4] sfc: store PTP filters in a list
    https://git.kernel.org/netdev/net-next/c/e790fc15bfbf
  - [v6,net-next,2/4] sfc: allow insertion of filters for unicast PTP
    https://git.kernel.org/netdev/net-next/c/75687cd06620
  - [v6,net-next,3/4] sfc: support unicast PTP
    (no matching commit)
  - [v6,net-next,4/4] sfc: remove expired unicast PTP filters
    https://git.kernel.org/netdev/net-next/c/ad47655eadc8

You are awesome, thank you!