struct ip_vs_iphdr iph;
        struct ip_vs_protocol *pp;
        struct ip_vs_conn *cp;
-       int ret, restart, af;
+       int ret, restart, af, pkts;
 
        af = (skb->protocol == htons(ETH_P_IP)) ? AF_INET : AF_INET6;
 
         * Sync connection if it is about to close to
         * encorage the standby servers to update the connections timeout
         */
-       atomic_inc(&cp->in_pkts);
+       pkts = atomic_add_return(1, &cp->in_pkts);
        if (af == AF_INET &&
            (ip_vs_sync_state & IP_VS_STATE_MASTER) &&
            (((cp->protocol != IPPROTO_TCP ||
               cp->state == IP_VS_TCP_S_ESTABLISHED) &&
-             (atomic_read(&cp->in_pkts) % sysctl_ip_vs_sync_threshold[1]
+             (pkts % sysctl_ip_vs_sync_threshold[1]
               == sysctl_ip_vs_sync_threshold[0])) ||
             ((cp->protocol == IPPROTO_TCP) && (cp->old_state != cp->state) &&
              ((cp->state == IP_VS_TCP_S_FIN_WAIT) ||
 
 static int ip_vs_wrr_max_weight(struct ip_vs_service *svc)
 {
        struct ip_vs_dest *dest;
-       int weight = 0;
+       int new_weight, weight = 0;
 
        list_for_each_entry(dest, &svc->destinations, n_list) {
-               if (atomic_read(&dest->weight) > weight)
-                       weight = atomic_read(&dest->weight);
+               new_weight = atomic_read(&dest->weight);
+               if (new_weight > weight)
+                       weight = new_weight;
        }
 
        return weight;