Commit b6e885dd authored by Hans Schillstrom's avatar Hans Schillstrom Committed by Simon Horman

IPVS: netns awarness to lblc sheduler

var sysctl_ip_vs_lblc_expiration moved to ipvs struct as
    sysctl_lblc_expiration

procfs updated to handle this.
Signed-off-by: default avatarHans Schillstrom <hans.schillstrom@ericsson.com>
Acked-by: default avatarJulian Anastasov <ja@ssi.bg>
Signed-off-by: default avatarSimon Horman <horms@verge.net.au>
parent d0a1eef9
...@@ -29,6 +29,10 @@ struct netns_ipvs { ...@@ -29,6 +29,10 @@ struct netns_ipvs {
struct list_head rs_table[IP_VS_RTAB_SIZE]; struct list_head rs_table[IP_VS_RTAB_SIZE];
/* ip_vs_lblc */
int sysctl_lblc_expiration;
struct ctl_table_header *lblc_ctl_header;
struct ctl_table *lblc_ctl_table;
/* ip_vs_lblcr */ /* ip_vs_lblcr */
int sysctl_lblcr_expiration; int sysctl_lblcr_expiration;
struct ctl_table_header *lblcr_ctl_header; struct ctl_table_header *lblcr_ctl_header;
......
...@@ -70,7 +70,6 @@ ...@@ -70,7 +70,6 @@
* entries that haven't been touched for a day. * entries that haven't been touched for a day.
*/ */
#define COUNT_FOR_FULL_EXPIRATION 30 #define COUNT_FOR_FULL_EXPIRATION 30
static int sysctl_ip_vs_lblc_expiration = 24*60*60*HZ;
/* /*
...@@ -117,7 +116,7 @@ struct ip_vs_lblc_table { ...@@ -117,7 +116,7 @@ struct ip_vs_lblc_table {
static ctl_table vs_vars_table[] = { static ctl_table vs_vars_table[] = {
{ {
.procname = "lblc_expiration", .procname = "lblc_expiration",
.data = &sysctl_ip_vs_lblc_expiration, .data = NULL,
.maxlen = sizeof(int), .maxlen = sizeof(int),
.mode = 0644, .mode = 0644,
.proc_handler = proc_dointvec_jiffies, .proc_handler = proc_dointvec_jiffies,
...@@ -125,8 +124,6 @@ static ctl_table vs_vars_table[] = { ...@@ -125,8 +124,6 @@ static ctl_table vs_vars_table[] = {
{ } { }
}; };
static struct ctl_table_header * sysctl_header;
static inline void ip_vs_lblc_free(struct ip_vs_lblc_entry *en) static inline void ip_vs_lblc_free(struct ip_vs_lblc_entry *en)
{ {
list_del(&en->list); list_del(&en->list);
...@@ -248,6 +245,7 @@ static inline void ip_vs_lblc_full_check(struct ip_vs_service *svc) ...@@ -248,6 +245,7 @@ static inline void ip_vs_lblc_full_check(struct ip_vs_service *svc)
struct ip_vs_lblc_entry *en, *nxt; struct ip_vs_lblc_entry *en, *nxt;
unsigned long now = jiffies; unsigned long now = jiffies;
int i, j; int i, j;
struct netns_ipvs *ipvs = net_ipvs(svc->net);
for (i=0, j=tbl->rover; i<IP_VS_LBLC_TAB_SIZE; i++) { for (i=0, j=tbl->rover; i<IP_VS_LBLC_TAB_SIZE; i++) {
j = (j + 1) & IP_VS_LBLC_TAB_MASK; j = (j + 1) & IP_VS_LBLC_TAB_MASK;
...@@ -255,7 +253,8 @@ static inline void ip_vs_lblc_full_check(struct ip_vs_service *svc) ...@@ -255,7 +253,8 @@ static inline void ip_vs_lblc_full_check(struct ip_vs_service *svc)
write_lock(&svc->sched_lock); write_lock(&svc->sched_lock);
list_for_each_entry_safe(en, nxt, &tbl->bucket[j], list) { list_for_each_entry_safe(en, nxt, &tbl->bucket[j], list) {
if (time_before(now, if (time_before(now,
en->lastuse + sysctl_ip_vs_lblc_expiration)) en->lastuse +
ipvs->sysctl_lblc_expiration))
continue; continue;
ip_vs_lblc_free(en); ip_vs_lblc_free(en);
...@@ -548,23 +547,43 @@ static struct ip_vs_scheduler ip_vs_lblc_scheduler = ...@@ -548,23 +547,43 @@ static struct ip_vs_scheduler ip_vs_lblc_scheduler =
*/ */
static int __net_init __ip_vs_lblc_init(struct net *net) static int __net_init __ip_vs_lblc_init(struct net *net)
{ {
if (!net_eq(net, &init_net)) /* netns not enabled yet */ struct netns_ipvs *ipvs = net_ipvs(net);
return -EPERM;
if (!net_eq(net, &init_net)) {
sysctl_header = register_net_sysctl_table(net, net_vs_ctl_path, ipvs->lblc_ctl_table = kmemdup(vs_vars_table,
vs_vars_table); sizeof(vs_vars_table),
if (!sysctl_header) GFP_KERNEL);
return -ENOMEM; if (ipvs->lblc_ctl_table == NULL)
goto err_dup;
} else
ipvs->lblc_ctl_table = vs_vars_table;
ipvs->sysctl_lblc_expiration = 24*60*60*HZ;
ipvs->lblc_ctl_table[0].data = &ipvs->sysctl_lblc_expiration;
ipvs->lblc_ctl_header =
register_net_sysctl_table(net, net_vs_ctl_path,
ipvs->lblc_ctl_table);
if (!ipvs->lblc_ctl_header)
goto err_reg;
return 0; return 0;
err_reg:
if (!net_eq(net, &init_net))
kfree(ipvs->lblc_ctl_table);
err_dup:
return -ENOMEM;
} }
static void __net_exit __ip_vs_lblc_exit(struct net *net) static void __net_exit __ip_vs_lblc_exit(struct net *net)
{ {
if (!net_eq(net, &init_net)) /* netns not enabled yet */ struct netns_ipvs *ipvs = net_ipvs(net);
return;
unregister_net_sysctl_table(sysctl_header); unregister_net_sysctl_table(ipvs->lblc_ctl_header);
if (!net_eq(net, &init_net))
kfree(ipvs->lblc_ctl_table);
} }
static struct pernet_operations ip_vs_lblc_ops = { static struct pernet_operations ip_vs_lblc_ops = {
...@@ -586,7 +605,6 @@ static int __init ip_vs_lblc_init(void) ...@@ -586,7 +605,6 @@ static int __init ip_vs_lblc_init(void)
return ret; return ret;
} }
static void __exit ip_vs_lblc_cleanup(void) static void __exit ip_vs_lblc_cleanup(void)
{ {
unregister_ip_vs_scheduler(&ip_vs_lblc_scheduler); unregister_ip_vs_scheduler(&ip_vs_lblc_scheduler);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment