/* replace the vid */
                tci = (tci & ~VLAN_VID_MASK) | p->tcfv_push_vid;
                /* replace prio bits, if tcfv_push_prio specified */
-               if (p->tcfv_push_prio) {
+               if (p->tcfv_push_prio_exists) {
                        tci &= ~VLAN_PRIO_MASK;
                        tci |= p->tcfv_push_prio << VLAN_PRIO_SHIFT;
                }
        struct tc_action_net *tn = net_generic(net, vlan_net_id);
        struct nlattr *tb[TCA_VLAN_MAX + 1];
        struct tcf_chain *goto_ch = NULL;
+       bool push_prio_exists = false;
        struct tcf_vlan_params *p;
        struct tc_vlan *parm;
        struct tcf_vlan *v;
                        push_proto = htons(ETH_P_8021Q);
                }
 
-               if (tb[TCA_VLAN_PUSH_VLAN_PRIORITY])
+               push_prio_exists = !!tb[TCA_VLAN_PUSH_VLAN_PRIORITY];
+               if (push_prio_exists)
                        push_prio = nla_get_u8(tb[TCA_VLAN_PUSH_VLAN_PRIORITY]);
                break;
        case TCA_VLAN_ACT_POP_ETH:
        p->tcfv_action = action;
        p->tcfv_push_vid = push_vid;
        p->tcfv_push_prio = push_prio;
+       p->tcfv_push_prio_exists = push_prio_exists || action == TCA_VLAN_ACT_PUSH;
        p->tcfv_push_proto = push_proto;
 
        if (action == TCA_VLAN_ACT_PUSH_ETH) {