struct xfrm_state *xs = NULL;
        struct ipv6hdr *ip6 = NULL;
        struct iphdr *ip4 = NULL;
+       struct sec_path *sp;
        void *daddr;
        __be32 spi;
        u8 *c_hdr;
        if (unlikely(!xs))
                return;
 
-       skb->sp = secpath_dup(skb->sp);
-       if (unlikely(!skb->sp))
+       sp = secpath_set(skb);
+       if (unlikely(!sp))
                return;
 
-       skb->sp->xvec[skb->sp->len++] = xs;
-       skb->sp->olen++;
+       sp->xvec[sp->len++] = xs;
+       sp->olen++;
        xo = xfrm_offload(skb);
        xo->flags = CRYPTO_DONE;
        xo->status = CRYPTO_SUCCESS;
 
        struct xfrm_state *xs = NULL;
        struct ipv6hdr *ip6 = NULL;
        struct iphdr *ip4 = NULL;
+       struct sec_path *sp;
        void *daddr;
        __be32 spi;
        u8 *c_hdr;
        if (unlikely(!xs))
                return;
 
-       skb->sp = secpath_dup(skb->sp);
-       if (unlikely(!skb->sp))
+       sp = secpath_set(skb);
+       if (unlikely(!sp))
                return;
 
-       skb->sp->xvec[skb->sp->len++] = xs;
-       skb->sp->olen++;
+       sp->xvec[sp->len++] = xs;
+       sp->olen++;
        xo = xfrm_offload(skb);
        xo->flags = CRYPTO_DONE;
        xo->status = CRYPTO_SUCCESS;
 
        struct mlx5e_priv *priv = netdev_priv(netdev);
        struct xfrm_offload *xo;
        struct xfrm_state *xs;
+       struct sec_path *sp;
        u32 sa_handle;
 
-       skb->sp = secpath_dup(skb->sp);
-       if (unlikely(!skb->sp)) {
+       sp = secpath_set(skb);
+       if (unlikely(!sp)) {
                atomic64_inc(&priv->ipsec->sw_stats.ipsec_rx_drop_sp_alloc);
                return NULL;
        }
                return NULL;
        }
 
-       skb->sp->xvec[skb->sp->len++] = xs;
-       skb->sp->olen++;
+       sp = skb_sec_path(skb);
+       sp->xvec[sp->len++] = xs;
+       sp->olen++;
 
        xo = xfrm_offload(skb);
        xo->flags = CRYPTO_DONE;
 
        bool
        depends on NET
        select GRO_CELLS
+       select SKB_EXTENSIONS
 
 config XFRM_OFFLOAD
        bool
 
        if (xfrm_dev_offload_ok(skb, x)) {
                struct sec_path *sp;
 
-               sp = secpath_dup(skb->sp);
+               sp = secpath_set(skb);
                if (!sp) {
                        XFRM_INC_STATS(net, LINUX_MIB_XFRMOUTERROR);
                        kfree_skb(skb);
                        return -ENOMEM;
                }
-               if (skb->sp)
-                       secpath_put(skb->sp);
-               skb->sp = sp;
                skb->encapsulation = 1;
 
                sp->olen++;
-               sp->xvec[skb->sp->len++] = x;
+               sp->xvec[sp->len++] = x;
                xfrm_state_hold(x);
 
                if (skb_is_gso(skb)) {