[netfilter-cvslog] r3777 -
branches/netfilter-ha/linux-2.6-actact/ct_sync
laforge at netfilter.org
laforge at netfilter.org
Thu Mar 10 13:22:36 CET 2005
Author: laforge at netfilter.org
Date: 2005-03-10 13:22:35 +0100 (Thu, 10 Mar 2005)
New Revision: 3777
Modified:
branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_main.c
Log:
move threads into per-instance data to avoid locking nightmare
Modified: branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_main.c
===================================================================
--- branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_main.c 2005-03-09 19:27:50 UTC (rev 3776)
+++ branches/netfilter-ha/linux-2.6-actact/ct_sync/ct_sync_main.c 2005-03-10 12:22:35 UTC (rev 3777)
@@ -121,6 +121,12 @@
unsigned int active; /* already activated ? */
atomic_t initsync_active;
+ struct cts_protoh *protoh; /* protocol handle */
+
+ struct task_struct *send_thread;
+ struct task_struct *recv_thread;
+ struct task_struct *initsync_thread;
+
/* sysfs stuff */
struct kobject kobj;
struct cts_inst_attribute state_attr;
@@ -129,9 +135,6 @@
struct cts_inst_attribute syncdev_attr;
struct cts_inst_attribute sendburst_attr;
struct cts_inst_attribute recvburst_attr;
-
- struct proc_dir_entry *pdr_state; /* state file */
- struct cts_protoh *protoh; /* protocol handle */
};
static LIST_HEAD(ct_sync_instances);
@@ -820,6 +823,7 @@
static int
ct_sync_send_thread_main(void *data)
{
+ struct ct_sync_instance *ctsi = (struct ct_sync_instance *) data;
unsigned long remaining;
DECLARE_WAITQUEUE(wait, current);
@@ -827,7 +831,6 @@
for (;;) {
int i = 0;
- struct ct_sync_instance *ctsi;
/* check if we should stop */
if (kthread_should_stop()) {
@@ -835,20 +838,18 @@
break;
}
- list_for_each_entry(ctsi, &ct_sync_instances, list) {
- /* if there are pending packets, dequeue and send
- * all of them */
- while (cts_proto_send_pending(ctsi->protoh)) {
- cts_proto_send_dequeue(ctsi->protoh);
-
- if (++i >= ctsi->config.send_burst)
- break;
- }
+ /* if there are pending packets, dequeue and send
+ * all of them */
+ while (cts_proto_send_pending(ctsi->protoh)) {
+ cts_proto_send_dequeue(ctsi->protoh);
- /* send an initsync request if necessary */
- cts_proto_initsync_request(ctsi->protoh);
+ if (++i >= ctsi->config.send_burst)
+ break;
}
+ /* send an initsync request if necessary */
+ cts_proto_initsync_request(ctsi->protoh);
+
__set_current_state(TASK_INTERRUPTIBLE);
add_wait_queue(&ct_sync_send_wait, &wait);
CT_SYNC_DEBUG2("falling asleep\n");
@@ -859,10 +860,8 @@
if (remaining <= 0) {
/* we had a timeout, try to advance buffer even if it's not full */
CT_SYNC_DEBUG2("woken up because schedule_timeout() timed out\n");
- list_for_each_entry(ctsi, &ct_sync_instances, list) {
- if (cts_proto_advance_timeout(ctsi->protoh) < 0)
- CT_SYNC_ERR("advancing current csb failed\n");
- }
+ if (cts_proto_advance_timeout(ctsi->protoh) < 0)
+ CT_SYNC_ERR("advancing current csb failed\n");
} else
CT_SYNC_DEBUG2("woken up after schedule_timeout() because we had an event\n");
}
@@ -957,20 +956,17 @@
static int
ct_sync_rcv_thread_main(void *data)
{
+ struct ct_sync_instance *ctsi = (struct ct_sync_instance *) data;
DECLARE_WAITQUEUE(wait, current);
CT_SYNC_ENTER();
for (;;) {
- struct ct_sync_instance *ctsi;
-
if (kthread_should_stop())
break;
- list_for_each_entry(ctsi, &ct_sync_instances, list) {
- if (_cts_rcv_thread_perinstance(ctsi, &wait) < 0)
- goto error;
- }
+ if (_cts_rcv_thread_perinstance(ctsi, &wait) < 0)
+ goto error;
}
error:
@@ -1112,13 +1108,12 @@
static int
ct_sync_initsync_thread_main(void *data)
{
+ struct ct_sync_instance *ctsi = (struct ct_sync_instance *) data;
DECLARE_WAITQUEUE(wait, current);
CT_SYNC_ENTER();
for (;;) {
- struct ct_sync_instance *ctsi;
-
__set_current_state(TASK_INTERRUPTIBLE);
add_wait_queue(&ct_sync_initsync_wait, &wait);
schedule();
@@ -1127,16 +1122,12 @@
/* somebody woke us. either initsync or thread termination
* request */
-
if (kthread_should_stop())
break;
CT_SYNC_INFO("starting initsync dump\n");
- list_for_each_entry(ctsi, &ct_sync_instances, list) {
- _cts_initsync_thread_perinstance(ctsi);
- }
-
+ _cts_initsync_thread_perinstance(ctsi);
}
CT_SYNC_LEAVE();
@@ -1742,7 +1733,7 @@
if ((sync_netdev = dev_get_by_name(syncdev)) != NULL) {
ctsi->syncdev_ifindex = sync_netdev->ifindex;
dev_put(sync_netdev);
- strlcpy(&ctsi->config.syncdev, syncdev, IFNAMSIZ-1);
+ strlcpy(ctsi->config.syncdev, syncdev, IFNAMSIZ-1);
} else
return -EINVAL;
@@ -1876,7 +1867,7 @@
CT_SYNC_ENTER();
list_for_each_entry(ctsi, &ct_sync_instances, list) {
- if (!strcmp(&ctsi->config.name, name)) {
+ if (!strcmp((char *)&ctsi->config.name, name)) {
CT_SYNC_DEBUG("found instance %p for '%s'\n",
ctsi, name);
CT_SYNC_LEAVE();
@@ -1907,7 +1898,7 @@
ctsi->config.send_burst = 100;
ctsi->config.recv_burst = 20;
ctsi->config.addr.ss_family = AF_INET;
- strlcpy(&ctsi->config.name, name, MAXNAMELEN);
+ strlcpy(ctsi->config.name, name, MAXNAMELEN);
spin_lock(&ctsync_lock);
if (__cts_instance_find(name)) {
@@ -1969,6 +1960,8 @@
if (ret < 0)
goto out_sysfs_sendburst;
+
+
list_add(&ctsi->list, &ct_sync_instances);
spin_unlock(&ctsync_lock);
@@ -1976,6 +1969,8 @@
CT_SYNC_LEAVE();
return ret;
+out_sysfs_recvburst:
+ sysfs_remove_file(&ctsi->kobj, &ctsi->recvburst_attr.attr);
out_sysfs_sendburst:
sysfs_remove_file(&ctsi->kobj, &ctsi->sendburst_attr.attr);
out_sysfs_syncdev:
@@ -2002,15 +1997,44 @@
CT_SYNC_ENTER();
ret = cts_proto_start(ctsi->protoh, &ctsi->config.addr,
- &ctsi->config.syncdev);
+ ctsi->config.syncdev);
if (ret)
goto out;
- ctsi->active = 1;
+ ctsi->recv_thread = kthread_run(ct_sync_rcv_thread_main, ctsi,
+ "ct_sync_recv");
+ if (IS_ERR(ctsi->recv_thread)) {
+ ret = PTR_ERR(ctsi->recv_thread);
+ goto out_proto;
+ }
+ ctsi->send_thread = kthread_run(ct_sync_send_thread_main, ctsi,
+ "ct_sync_send");
+ if (IS_ERR(ctsi->send_thread)) {
+ ret = PTR_ERR(ctsi->send_thread);
+ goto out_recvthread;
+ }
+
+ ctsi->initsync_thread = kthread_run(ct_sync_initsync_thread_main,
+ ctsi, "ct_sync_initsync");
+ if (IS_ERR(ctsi->initsync_thread)) {
+ ret = PTR_ERR(ctsi->initsync_thread);
+ goto out_sendthread;
+ }
+
+ ctsi->active = 1;
out:
CT_SYNC_LEAVE();
return ret;
+
+out_sendthread:
+ kthread_stop(ctsi->send_thread);
+out_recvthread:
+ kthread_stop(ctsi->recv_thread);
+out_proto:
+ cts_proto_stop(ctsi->protoh);
+
+ goto out;
}
static void
@@ -2018,6 +2042,13 @@
{
CT_SYNC_ENTER();
+ CT_SYNC_DEBUG("stopping initsync thread\n");
+ kthread_stop(ctsi->initsync_thread);
+ CT_SYNC_DEBUG("stopping send thread\n");
+ kthread_stop(ctsi->send_thread);
+ CT_SYNC_DEBUG("stopping recv thread\n");
+ kthread_stop(ctsi->recv_thread);
+
ctsi->active = 0;
cts_proto_stop(ctsi->protoh);
@@ -2138,30 +2169,6 @@
goto error_hook3;
ct_sync_stat->proc_fops = &cts_stat_seq_fops;
- /* start threads */
-#if 0
- rcv_thread = kthread_run(ct_sync_rcv_thread_main, NULL,
- "ct_sync_rcv");
- if (IS_ERR(rcv_thread)) {
- ret = PTR_ERR(rcv_thread);
- goto error_stat;
- }
-
- send_thread = kthread_run(ct_sync_send_thread_main, NULL,
- "ct_sync_send");
- if (IS_ERR(send_thread)) {
- ret = PTR_ERR(send_thread);
- goto error_rthread;
- }
-
- initsync_thread = kthread_run(ct_sync_initsync_thread_main, NULL,
- "ct_sync_initsync");
- if (IS_ERR(initsync_thread)) {
- ret = PTR_ERR(initsync_thread);
- goto error_sthread;
- }
-#endif
-
/* Now we have all of our infrastructure up and running */
printk(KERN_NOTICE "netfilter conntrack_sync version %s loaded\n",
CT_SYNC_VERSION);
@@ -2181,12 +2188,11 @@
/* first remove control file to prevent further commands coming in */
sysfs_remove_file(&cts_instance_kset.kobj, &create_attr.attr);
-
{
struct ct_sync_instance *ctsi, *tmp;
CT_SYNC_DEBUG("deactivating/destroying all instances\n");
list_for_each_entry_safe(ctsi, tmp, &ct_sync_instances, list) {
- cts_instance_deactivate(ctsi->config.name);
+ cts_instance_deactivate(ctsi);
cts_instance_destroy(ctsi->config.name);
}
}
@@ -2194,25 +2200,6 @@
nf_kset_unregister(&cts_instance_kset);
nf_subsys_unregister(&nfss_ctsync);
-
- CT_SYNC_DEBUG("stopping initsync thread\n");
- //err = kthread_stop(initsync_thread);
- if (err < 0) {
- CT_SYNC_INFO("unable to stop initsync thread\n");
- }
-error_sthread:
- CT_SYNC_DEBUG("stopping send thread\n");
- //err = kthread_stop(send_thread);
- if (err < 0) {
- CT_SYNC_INFO("unable to stop send thread\n");
- }
-error_rthread:
- CT_SYNC_DEBUG("stopping receive thread\n");
- //err = kthread_stop(rcv_thread);
- if (err < 0) {
- CT_SYNC_INFO("unable to stop receive thread\n");
- }
-
CT_SYNC_DEBUG("unregistering conntrack notifier\n");
ip_conntrack_unregister_notifier(&ct_sync_notifier);
error_stat:
More information about the netfilter-cvslog
mailing list