struct nf_conntrack_ecache {
        unsigned long cache;            /* bitops want long */
-       u16 missed;                     /* missed events */
        u16 ctmask;                     /* bitmask of ct events to be delivered */
        u16 expmask;                    /* bitmask of expect events to be delivered */
        enum nf_ct_ecache_state state:8;/* ecache state */
+       u32 missed;                     /* missed events */
        u32 portid;                     /* netlink portid of destroyer */
 };
 
 
 }
 
 static int __nf_conntrack_eventmask_report(struct nf_conntrack_ecache *e,
-                                          const unsigned int events,
-                                          const unsigned long missed,
+                                          const u32 events,
+                                          const u32 missed,
                                           const struct nf_ct_event *item)
 {
-       struct nf_conn *ct = item->ct;
        struct net *net = nf_ct_net(item->ct);
        struct nf_ct_event_notifier *notify;
+       u32 old, want;
        int ret;
 
        if (!((events | missed) & e->ctmask))
        if (likely(ret >= 0 && missed == 0))
                return 0;
 
-       spin_lock_bh(&ct->lock);
-       if (ret < 0)
-               e->missed |= events;
-       else
-               e->missed &= ~missed;
-       spin_unlock_bh(&ct->lock);
+       do {
+               old = READ_ONCE(e->missed);
+               if (ret < 0)
+                       want = old | events;
+               else
+                       want = old & ~missed;
+       } while (cmpxchg(&e->missed, old, want) != old);
 
        return ret;
 }
 {
        struct nf_conntrack_ecache *e;
        struct nf_ct_event item;
-       unsigned long missed;
+       unsigned int missed;
        int ret;
 
        if (!nf_ct_is_confirmed(ct))
 {
        struct nf_conntrack_ecache *e;
        struct nf_ct_event item;
-       unsigned long events;
+       unsigned int events;
 
        if (!nf_ct_is_confirmed(ct) || nf_ct_is_dying(ct))
                return;
        cnet->ct_net = &net->ct;
        INIT_DELAYED_WORK(&cnet->ecache_dwork, ecache_work);
 
-       BUILD_BUG_ON(__IPCT_MAX >= 16); /* ctmask, missed use u16 */
+       BUILD_BUG_ON(__IPCT_MAX >= 16); /* e->ctmask is u16 */
 }
 
 void nf_conntrack_ecache_pernet_fini(struct net *net)