]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - net/ipv4/ipvs/ip_vs_ctl.c
[IPVS]: Add and reorder bh locks after moving to keventd.
[net-next-2.6.git] / net / ipv4 / ipvs / ip_vs_ctl.c
index 12a82e91d22ac4d31cfd62143d1b9aa7e1cdbab2..7d99ede2ef79316f4842e6b2b2eb7465cbcd0bcb 100644 (file)
@@ -90,7 +90,8 @@ int ip_vs_get_debug_level(void)
 #endif
 
 /*
- *     update_defense_level is called from keventd and from sysctl.
+ *     update_defense_level is called from keventd and from sysctl,
+ *     so it needs to protect itself from softirqs
  */
 static void update_defense_level(void)
 {
@@ -110,6 +111,8 @@ static void update_defense_level(void)
 
        nomem = (availmem < sysctl_ip_vs_amemthresh);
 
+       local_bh_disable();
+
        /* drop_entry */
        spin_lock(&__ip_vs_dropentry_lock);
        switch (sysctl_ip_vs_drop_entry) {
@@ -206,6 +209,8 @@ static void update_defense_level(void)
        if (to_change >= 0)
                ip_vs_protocol_timeout_change(sysctl_ip_vs_secure_tcp>1);
        write_unlock(&__ip_vs_securetcp_lock);
+
+       local_bh_enable();
 }
 
 
@@ -1360,9 +1365,7 @@ proc_do_defense_mode(ctl_table *table, int write, struct file * filp,
                        /* Restore the correct value */
                        *valp = val;
                } else {
-                       local_bh_disable();
                        update_defense_level();
-                       local_bh_enable();
                }
        }
        return rc;