]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfrm: Skip redundant statistics update for crypto offload
authorJianbo Liu <jianbol@nvidia.com>
Thu, 3 Jul 2025 08:45:27 +0000 (11:45 +0300)
committerSteffen Klassert <steffen.klassert@secunet.com>
Fri, 4 Jul 2025 07:30:22 +0000 (09:30 +0200)
In the crypto offload path, every packet is still processed by the
software stack. The state's statistics required for the expiration
check are being updated in software.

However, the code also calls xfrm_dev_state_update_stats(), which
triggers a query to the hardware device to fetch statistics. This
hardware query is redundant and introduces unnecessary performance
overhead.

Skip this call when it's crypto offload (not packet offload) to avoid
the unnecessary hardware access, thereby improving performance.

Signed-off-by: Jianbo Liu <jianbol@nvidia.com>
Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_state.c

index b3950234b150561a5fc77cd04966b89bc62e4e49..f0f66405b39d2e1af286484bba8a598f31aa3e4b 100644 (file)
@@ -2282,7 +2282,12 @@ EXPORT_SYMBOL(xfrm_state_update);
 
 int xfrm_state_check_expire(struct xfrm_state *x)
 {
-       xfrm_dev_state_update_stats(x);
+       /* All counters which are needed to decide if state is expired
+        * are handled by SW for non-packet offload modes. Simply skip
+        * the following update and save extra boilerplate in drivers.
+        */
+       if (x->xso.type == XFRM_DEV_OFFLOAD_PACKET)
+               xfrm_dev_state_update_stats(x);
 
        if (!READ_ONCE(x->curlft.use_time))
                WRITE_ONCE(x->curlft.use_time, ktime_get_real_seconds());