acct = nf_conn_acct_find(ct);
                if (acct) {
-                       spin_lock_bh(&ct->lock);
-                       acct[CTINFO2DIR(ctinfo)].packets++;
-                       acct[CTINFO2DIR(ctinfo)].bytes += skb->len;
-                       spin_unlock_bh(&ct->lock);
+                       atomic64_inc(&acct[CTINFO2DIR(ctinfo)].packets);
+                       atomic64_add(skb->len, &acct[CTINFO2DIR(ctinfo)].bytes);
                }
        }
 }
 
                acct = nf_conn_acct_find(ct);
                if (acct) {
-                       spin_lock_bh(&ct->lock);
-                       acct[CTINFO2DIR(ctinfo)].packets++;
-                       acct[CTINFO2DIR(ctinfo)].bytes +=
-                               skb->len - skb_network_offset(skb);
-                       spin_unlock_bh(&ct->lock);
+                       atomic64_inc(&acct[CTINFO2DIR(ctinfo)].packets);
+                       atomic64_add(skb->len - skb_network_offset(skb),
+                                    &acct[CTINFO2DIR(ctinfo)].bytes);
                }
        }
 
 
                goto nla_put_failure;
 
        NLA_PUT_BE64(skb, CTA_COUNTERS_PACKETS,
-                    cpu_to_be64(acct[dir].packets));
+                    cpu_to_be64(atomic64_read(&acct[dir].packets)));
        NLA_PUT_BE64(skb, CTA_COUNTERS_BYTES,
-                    cpu_to_be64(acct[dir].bytes));
+                    cpu_to_be64(atomic64_read(&acct[dir].bytes)));
 
        nla_nest_end(skb, nest_count);
 
                                struct nf_conn_counter *acct;
 
                                acct = nf_conn_acct_find(ct);
-                               if (acct)
-                                       memset(acct, 0, sizeof(struct nf_conn_counter[IP_CT_DIR_MAX]));
+                               if (acct) {
+                                       atomic64_set(&acct[IP_CT_DIR_ORIGINAL].bytes, 0);
+                                       atomic64_set(&acct[IP_CT_DIR_ORIGINAL].packets, 0);
+                                       atomic64_set(&acct[IP_CT_DIR_REPLY].bytes, 0);
+                                       atomic64_set(&acct[IP_CT_DIR_REPLY].packets, 0);
+                                       }
                        }
                }
                if (cb->args[1]) {
 
        case XT_CONNBYTES_PKTS:
                switch (sinfo->direction) {
                case XT_CONNBYTES_DIR_ORIGINAL:
-                       what = counters[IP_CT_DIR_ORIGINAL].packets;
+                       what = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].packets);
                        break;
                case XT_CONNBYTES_DIR_REPLY:
-                       what = counters[IP_CT_DIR_REPLY].packets;
+                       what = atomic64_read(&counters[IP_CT_DIR_REPLY].packets);
                        break;
                case XT_CONNBYTES_DIR_BOTH:
-                       what = counters[IP_CT_DIR_ORIGINAL].packets;
-                       what += counters[IP_CT_DIR_REPLY].packets;
+                       what = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].packets);
+                       what += atomic64_read(&counters[IP_CT_DIR_REPLY].packets);
                        break;
                }
                break;
        case XT_CONNBYTES_BYTES:
                switch (sinfo->direction) {
                case XT_CONNBYTES_DIR_ORIGINAL:
-                       what = counters[IP_CT_DIR_ORIGINAL].bytes;
+                       what = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].bytes);
                        break;
                case XT_CONNBYTES_DIR_REPLY:
-                       what = counters[IP_CT_DIR_REPLY].bytes;
+                       what = atomic64_read(&counters[IP_CT_DIR_REPLY].bytes);
                        break;
                case XT_CONNBYTES_DIR_BOTH:
-                       what = counters[IP_CT_DIR_ORIGINAL].bytes;
-                       what += counters[IP_CT_DIR_REPLY].bytes;
+                       what = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].bytes);
+                       what += atomic64_read(&counters[IP_CT_DIR_REPLY].bytes);
                        break;
                }
                break;
        case XT_CONNBYTES_AVGPKT:
                switch (sinfo->direction) {
                case XT_CONNBYTES_DIR_ORIGINAL:
-                       bytes = counters[IP_CT_DIR_ORIGINAL].bytes;
-                       pkts  = counters[IP_CT_DIR_ORIGINAL].packets;
+                       bytes = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].bytes);
+                       pkts  = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].packets);
                        break;
                case XT_CONNBYTES_DIR_REPLY:
-                       bytes = counters[IP_CT_DIR_REPLY].bytes;
-                       pkts  = counters[IP_CT_DIR_REPLY].packets;
+                       bytes = atomic64_read(&counters[IP_CT_DIR_REPLY].bytes);
+                       pkts  = atomic64_read(&counters[IP_CT_DIR_REPLY].packets);
                        break;
                case XT_CONNBYTES_DIR_BOTH:
-                       bytes = counters[IP_CT_DIR_ORIGINAL].bytes +
-                               counters[IP_CT_DIR_REPLY].bytes;
-                       pkts  = counters[IP_CT_DIR_ORIGINAL].packets +
-                               counters[IP_CT_DIR_REPLY].packets;
+                       bytes = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].bytes) +
+                               atomic64_read(&counters[IP_CT_DIR_REPLY].bytes);
+                       pkts  = atomic64_read(&counters[IP_CT_DIR_ORIGINAL].packets) +
+                               atomic64_read(&counters[IP_CT_DIR_REPLY].packets);
                        break;
                }
                if (pkts != 0)