nft_trace_notify(info);
 }
 
-static inline void nft_trace_packet(struct nft_traceinfo *info,
+static inline void nft_trace_packet(const struct nft_pktinfo *pkt,
+                                   struct nft_traceinfo *info,
                                    const struct nft_chain *chain,
                                    const struct nft_rule_dp *rule,
                                    enum nft_trace_types type)
 {
        if (static_branch_unlikely(&nft_trace_enabled)) {
-               const struct nft_pktinfo *pkt = info->pkt;
-
                info->nf_trace = pkt->skb->nf_trace;
                info->rule = rule;
                __nft_trace_packet(info, chain, type);
        }
 }
 
-static inline void nft_trace_copy_nftrace(struct nft_traceinfo *info)
+static inline void nft_trace_copy_nftrace(const struct nft_pktinfo *pkt,
+                                         struct nft_traceinfo *info)
 {
        if (static_branch_unlikely(&nft_trace_enabled)) {
-               const struct nft_pktinfo *pkt = info->pkt;
-
                if (info->trace)
                        info->nf_trace = pkt->skb->nf_trace;
        }
                                         const struct nft_chain *chain,
                                         const struct nft_regs *regs)
 {
-       const struct nft_pktinfo *pkt = info->pkt;
        enum nft_trace_types type;
 
        switch (regs->verdict.code) {
                break;
        default:
                type = NFT_TRACETYPE_RULE;
-               info->nf_trace = pkt->skb->nf_trace;
+
+               if (info->trace)
+                       info->nf_trace = info->pkt->skb->nf_trace;
                break;
        }
 
                switch (regs.verdict.code) {
                case NFT_BREAK:
                        regs.verdict.code = NFT_CONTINUE;
-                       nft_trace_copy_nftrace(&info);
+                       nft_trace_copy_nftrace(pkt, &info);
                        continue;
                case NFT_CONTINUE:
-                       nft_trace_packet(&info, chain, rule,
+                       nft_trace_packet(pkt, &info, chain, rule,
                                         NFT_TRACETYPE_RULE);
                        continue;
                }
                goto next_rule;
        }
 
-       nft_trace_packet(&info, basechain, NULL, NFT_TRACETYPE_POLICY);
+       nft_trace_packet(pkt, &info, basechain, NULL, NFT_TRACETYPE_POLICY);
 
        if (static_branch_unlikely(&nft_counters_enabled))
                nft_update_chain_stats(basechain, pkt);