static void rds_ib_initial_failovers(struct work_struct *workarg);
DECLARE_DELAYED_WORK(riif_dlywork, rds_ib_initial_failovers);
static int timeout_until_initial_failovers;
+static struct workqueue_struct *rds_ip_wq;
/*
* rds_detected_linklayer_up
rds_rtd(RDS_RTD_ACT_BND,
"active bonding fallback enabled\n");
INIT_DELAYED_WORK(&work->work, rds_ib_failback);
- queue_delayed_work(rds_wq, &work->work,
+ queue_delayed_work(rds_ip_wq, &work->work,
get_failback_sync_jiffies(&ip_config[port]));
} else
kfree(work);
} else {
/* this_port_transition == RDSIBP_TRANSITION_DOWN */
INIT_DELAYED_WORK(&work->work, rds_ib_failover);
- queue_delayed_work(rds_wq, &work->work, 0);
+ queue_delayed_work(rds_ip_wq, &work->work, 0);
}
}
}
if (timeout_until_initial_failovers > 0) {
timeout_until_initial_failovers -=
msecs_to_jiffies(100);
- queue_delayed_work(rds_wq,
+ queue_delayed_work(rds_ip_wq,
&riif_dlywork,
msecs_to_jiffies(100));
initial_failovers_iterations++;
timeout_until_initial_failovers = trigger_delay_max_jiffies;
- queue_delayed_work(rds_wq,
+ queue_delayed_work(rds_ip_wq,
&riif_dlywork,
trigger_delay_min_jiffies);
}
{
ib_unregister_client(&rds_ib_client);
/* wait for rds_ib_dev_free() to complete */
- flush_workqueue(rds_wq);
+ flush_workqueue(rds_ip_wq);
flush_workqueue(rds_local_wq);
}
if (in_dev && !in_dev->ifa_list && work->timeout > 0) {
INIT_DELAYED_WORK(&work->work, rds_ib_joining_ip);
work->timeout -= msecs_to_jiffies(100);
- queue_delayed_work(rds_wq, &work->work, msecs_to_jiffies(100));
+ queue_delayed_work(rds_ip_wq, &work->work, msecs_to_jiffies(100));
} else if (in_dev && in_dev->ifa_list) {
u16 pkey = 0;
work->dev = ndev;
work->timeout = msecs_to_jiffies(10000);
INIT_DELAYED_WORK(&work->work, rds_ib_joining_ip);
- queue_delayed_work(rds_wq, &work->work,
+ queue_delayed_work(rds_ip_wq, &work->work,
msecs_to_jiffies(100));
}
}
rds_rtd(RDS_RTD_ACT_BND,
"active bonding fallback enabled\n");
INIT_DELAYED_WORK(&work->work, rds_ib_failback);
- queue_delayed_work(rds_wq, &work->work,
+ queue_delayed_work(rds_ip_wq, &work->work,
get_failback_sync_jiffies(&ip_config[port]));
ip_config[port].port_active_ts = 0;
} else
case RDSIBP_TRANSITION_DOWN:
if (rds_ib_sysctl_active_bonding) {
INIT_DELAYED_WORK(&work->work, rds_ib_failover);
- queue_delayed_work(rds_wq, &work->work, 0);
+ queue_delayed_work(rds_ip_wq, &work->work, 0);
} else {
/*
* Note: Active bonding disabled by override
.notifier_call = rds_ib_netdev_callback
};
+void rds_ip_thread_exit(void)
+{
+ flush_workqueue(rds_ip_wq);
+ destroy_workqueue(rds_ip_wq);
+}
+
+int rds_ip_threads_init(void)
+{
+ rds_ip_wq = create_singlethread_workqueue("krdsd_ip");
+ if (!rds_ip_wq)
+ return -ENOMEM;
+ return 0;
+}
+
+
int rds_ib_init(void)
{
int ret;
rds_info_register_func(RDS_INFO_IB_CONNECTIONS, rds_ib_ic_info);
+ ret = rds_ip_threads_init();
+ if (ret) {
+ printk(KERN_ERR "RDS: failed to create IP thread\n");
+ goto out_ibreg;
+ }
+
rds_ib_ip_excl_ips_init();
ret = rds_ib_ip_config_init();
if (ret) {
printk(KERN_ERR "RDS/IB: failed to init port\n");
- goto out_ibreg;
+ goto out_ip_thread;
}
rds_ib_ip_failover_groups_init();
goto out;
+out_ip_thread:
+ rds_ip_thread_exit();
out_ibreg:
rds_ib_unregister_client();
out_recv:
destroy_workqueue(rds_aux_wq);
rds_trans_unregister(&rds_ib_transport);
rds_ib_fmr_exit();
+ rds_ip_thread_exit();
if (ip_config)
kfree(ip_config);