net: dsa: don't call ptp_classify_raw() if switch doesn't provide RX timestamping
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 9 Dec 2022 17:58:40 +0000 (19:58 +0200)
committerJakub Kicinski <kuba@kernel.org>
Mon, 12 Dec 2022 23:03:21 +0000 (15:03 -0800)
ptp_classify_raw() is not exactly cheap, since it invokes a BPF program
for every skb in the receive path. For switches which do not provide
ds->ops->port_rxtstamp(), running ptp_classify_raw() provides precisely
nothing, so check for the presence of the function pointer first, since
that is much cheaper.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Reviewed-by: Kurt Kanzenbach <kurt@linutronix.de>
Link: https://lore.kernel.org/r/20221209175840.390707-1-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/dsa/tag.c

index 383721e167d63de63ef3714d13390b49f45322b3..b2fba1a003ce369a275b7fdbb08952d7165804a5 100644 (file)
@@ -33,6 +33,9 @@ static bool dsa_skb_defer_rx_timestamp(struct dsa_slave_priv *p,
        struct dsa_switch *ds = p->dp->ds;
        unsigned int type;
 
+       if (!ds->ops->port_rxtstamp)
+               return false;
+
        if (skb_headroom(skb) < ETH_HLEN)
                return false;
 
@@ -45,10 +48,7 @@ static bool dsa_skb_defer_rx_timestamp(struct dsa_slave_priv *p,
        if (type == PTP_CLASS_NONE)
                return false;
 
-       if (likely(ds->ops->port_rxtstamp))
-               return ds->ops->port_rxtstamp(ds, p->dp->index, skb, type);
-
-       return false;
+       return ds->ops->port_rxtstamp(ds, p->dp->index, skb, type);
 }
 
 static int dsa_switch_rcv(struct sk_buff *skb, struct net_device *dev,