[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