[patch 3/21] openmosix/openmosix-__kcom_task_find-spinlocks.patch
Florian Delizy <[email protected]> Wed, 01 Nov 2006 05:10:35 +0100
| Newsgroups | gmane.linux.cluster.openmosix.devel |
|---|---|
| Message-ID | <[email protected]> |
This patch fixes the spinlock usage in __kcom_find_task ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ openMosix-devel mailing list openMosix-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org https://lists.sourceforge.net/lists/listinfo/openmosix-devel
openmosix-__kcom_task_find-spinlocks.patch
(text/x-patch, 2.4 KB)
[patch @num@/@total@] @name@ fix spinlock usage
This patch fixes the spinlock usage in __kcom_find_task
Index: linux/hpc/kcom.c
===================================================================
--- linux.orig/hpc/kcom.c 2006-10-19 16:32:03.000000000 +0200
+++ linux/hpc/kcom.c 2006-10-27 22:11:40.000000000 +0200
@@ -572,17 +572,23 @@
struct kcom_task *tmp2;
task_t *p;
- // read_lock(&tasklist_lock);
+ read_lock(&tasklist_lock);
p = find_task_by_pid(pid);
- // read_unlock(&tasklist_lock);
+ read_unlock(&tasklist_lock);
if (!p) {
printk(KERN_ERR "Unable to find pid %u\n", pid);
return NULL;
}
+ // TODO: needs some cleanup (-- Florian Delizy)
if (where == 0) {
- list_for_each_entry(tmp, &kcom_nodes, list)
- list_for_each_entry(tmp2, &tmp->tasks, list)
+
+ read_lock( &kcom_nodes_lock );
+
+ list_for_each_entry(tmp, &kcom_nodes, list) {
+
+ read_lock( &tmp->tasks_lock );
+ list_for_each_entry(tmp2, &tmp->tasks, list) {
/*
* One remote node, we're interested in rpid
* One home node, we're interested in hpid
@@ -594,16 +600,42 @@
if (tmp2->hpid == pid)
return tmp2;
}
+ }
+ read_unlock( &tmp->tasks_lock );
+ }
+ read_unlock( &kcom_nodes_lock );
+
} else if (where == 1) { /* home */
- list_for_each_entry(tmp, &kcom_nodes, list)
- list_for_each_entry(tmp2, &tmp->tasks, list)
+
+ read_lock( &kcom_nodes_lock );
+ list_for_each_entry(tmp, &kcom_nodes, list) {
+
+ read_lock( &tmp->tasks_lock );
+
+ list_for_each_entry(tmp2, &tmp->tasks, list) {
if (tmp2->hpid == pid)
return tmp2;
+ }
+
+ read_unlock( &tmp->tasks_lock );
+ }
+ read_unlock( &kcom_nodes_lock );
+
} else if (where == 2) { /* remote */
- list_for_each_entry(tmp, &kcom_nodes, list)
- list_for_each_entry(tmp2, &tmp->tasks, list)
+
+ read_lock( &kcom_nodes_lock );
+ list_for_each_entry(tmp, &kcom_nodes, list) {
+
+ read_lock( &tmp->tasks_lock );
+
+ list_for_each_entry(tmp2, &tmp->tasks, list) {
if (tmp2->rpid == pid)
return tmp2;
+ }
+
+ read_unlock( &tmp->tasks_lock );
+ }
+ read_unlock( &kcom_nodes_lock );
}
return NULL;