return 0;
 
        /* make sure the fields we don't use are zeroed */
-       if (!range_is_zero(__skb, 0, offsetof(struct __sk_buff, priority)))
+       if (!range_is_zero(__skb, 0, offsetof(struct __sk_buff, mark)))
+               return -EINVAL;
+
+       /* mark is allowed */
+
+       if (!range_is_zero(__skb, offsetofend(struct __sk_buff, mark),
+                          offsetof(struct __sk_buff, priority)))
                return -EINVAL;
 
        /* priority is allowed */
                           sizeof(struct __sk_buff)))
                return -EINVAL;
 
+       skb->mark = __skb->mark;
        skb->priority = __skb->priority;
        skb->tstamp = __skb->tstamp;
        memcpy(&cb->data, __skb->cb, QDISC_CB_PRIV_LEN);
        if (!__skb)
                return;
 
+       __skb->mark = skb->mark;
        __skb->priority = skb->priority;
        __skb->tstamp = skb->tstamp;
        memcpy(__skb->cb, &cb->data, QDISC_CB_PRIV_LEN);
 
                .tstamp = 7,
                .wire_len = 100,
                .gso_segs = 8,
+               .mark = 9,
        };
        struct bpf_prog_test_run_attr tattr = {
                .data_in = &pkt_v4,
                   "ctx_out_tstamp",
                   "skb->tstamp == %lld, expected %d\n",
                   skb.tstamp, 8);
+       CHECK_ATTR(skb.mark != 10,
+                  "ctx_out_mark",
+                  "skb->mark == %u, expected %d\n",
+                  skb.mark, 10);
 }