[Patch] /proc interface
Ansgar Esztermann <[email protected]>
| Newsgroups | gmane.linux.cluster.openmosix.devel |
|---|---|
| Message-ID | <[email protected]> |
Here are some improvements to /proc/{pid}/om/where:
-Upon read, return the socket's peer address, not its own. In the
current version, a migrated process would report the IP address of its
home node.
-When asking an already migrated process to move to another (remote)
node, bring it back home first. The current implementation leads to a
crash. A direct remote->remote migration would be better, but is not
implemented yet.
This change entails reordering two functions in hpc/migctrl.c, so the
changes look worse than they really are.
-When trying to migrate a task back home, check whether it really is
migrated to a remote node. Failing to do so will lead to a crash.
Have a nice weekend,
A.
diff -ruNp linux-2.6-om/hpc/comm.c linux-2.6-om-work/hpc/comm.c
--- linux-2.6-om/hpc/comm.c 2006-02-07 16:51:58.000000000 +0100
+++ linux-2.6-om-work/hpc/comm.c 2006-03-24 18:36:26.000000000 +0100
@@ -54,10 +54,11 @@ static void comm_shutdown(om_link_t *mli
/**
* comm_getname - get the name of socket
- * @mlink: openMosix link to shutdown
+ * @mlink: openMosix link to query
* @address: the sockaddr to fill
+ * @peer: get peer name instead?
**/
-int comm_getname(om_link_t *mlink, struct sockaddr *address)
+int comm_getname(om_link_t *mlink, struct sockaddr *address, int peer)
{
struct socket *sock;
int val, ret;
@@ -66,7 +67,7 @@ int comm_getname(om_link_t *mlink, struc
sock = mlink->sock;
if (!sock->ops || !sock->ops->getname)
return -1;
- ret = sock->ops->getname(sock, address, &val, 0);
+ ret = sock->ops->getname(sock, address, &val, peer);
if (ret)
return -1;
return val;
diff -ruNp linux-2.6-om/hpc/migctrl.c linux-2.6-om-work/hpc/migctrl.c
--- linux-2.6-om/hpc/migctrl.c 2006-02-07 16:51:58.000000000 +0100
+++ linux-2.6-om-work/hpc/migctrl.c 2006-03-24 18:36:26.000000000 +0100
@@ -79,6 +79,44 @@ int task_remote_wait_expel(task_t *p)
return task_remote_expel(p);
}
+
+/**
+ * task_local_bring - Receive task back in the deputy stub
+ * @p: deputy task to receive
+ * @reason: reason to send (if any)
+ **/
+static int task_local_bring(task_t *p, int reason)
+{
+ int error;
+ om_link_t *link;
+
+ if (obtain_mm(p)) {
+ printk(KERN_ERR "unable to obtain mm\n");
+ goto failed;
+ }
+
+ /* send remote request */
+ comm_send_req(p->om.contact, DEP_COMING_HOME);
+
+ /* see if other part is with on this */
+ if (mig_recv_hshake(p->om.contact))
+ goto failed;
+
+ /* receive the process back */
+ error = mig_do_receive(p);
+ if (error)
+ goto failed;
+
+ task_clear_dflags(p, DDEPUTY);
+ link = task_set_comm(p, NULL);
+ comm_close(link);
+
+ return 0;
+failed:
+ OMBUG("failed\n");
+ return -1;
+}
+
/**
* task_local_send - Send a local task to remote
* @p: task to send
@@ -90,6 +128,14 @@ static int task_local_send(task_t *p, st
om_link_t *mlink;
int error = 0;
+ /* if this is a stub, bring it back first */
+ if (p->om.contact)
+ {
+ error = task_local_bring(p, reason);
+ if (error)
+ goto failed;
+ }
+
sockaddr_setup_port(whereto, REMOTE_DAEMON_PORT);
mlink = comm_setup_connect(whereto, 0);
if (!mlink) {
@@ -123,44 +169,6 @@ failed:
}
-
-/**
- * task_local_bring - Receive task back in the deputy stub
- * @p: deputy task to receive
- * @reason: reason to send (if any)
- **/
-static int task_local_bring(task_t *p, int reason)
-{
- int error;
- om_link_t *link;
-
- if (obtain_mm(p)) {
- printk(KERN_ERR "unable to obtain mm\n");
- goto failed;
- }
-
- /* send remote request */
- comm_send_req(p->om.contact, DEP_COMING_HOME);
-
- /* see if other part is with on this */
- if (mig_recv_hshake(p->om.contact))
- goto failed;
-
- /* receive the process back */
- error = mig_do_receive(p);
- if (error)
- goto failed;
-
- task_clear_dflags(p, DDEPUTY);
- link = task_set_comm(p, NULL);
- comm_close(link);
-
- return 0;
-failed:
- OMBUG("failed\n");
- return -1;
-}
-
/**
* task_move_remote2remote - migrate a task from remote to remote
* @p: task to send
diff -ruNp linux-2.6-om/hpc/proc.c linux-2.6-om-work/hpc/proc.c
--- linux-2.6-om/hpc/proc.c 2006-02-07 16:51:58.000000000 +0100
+++ linux-2.6-om-work/hpc/proc.c 2006-03-24 18:36:26.000000000 +0100
@@ -57,7 +57,7 @@ static int proc_pid_get_where(struct tas
struct sockaddr address;
if (p->om.contact) {
- comm_getname(p->om.contact, &address);
+ comm_getname(p->om.contact, &address, 1);
length = sockaddr_to_string(&address, buf);
length += sprintf(buf + length, "\n");
} else
diff -ruNp linux-2.6-om/hpc/remote.c linux-2.6-om-work/hpc/remote.c
--- linux-2.6-om/hpc/remote.c 2006-02-07 16:51:58.000000000 +0100
+++ linux-2.6-om-work/hpc/remote.c 2006-03-24 18:36:26.000000000 +0100
@@ -264,7 +264,7 @@ long remote_do_fork(unsigned long clone_
if (!childsock)
goto fail;
- if (comm_getname(childsock, &sa) < 0)
+ if (comm_getname(childsock, &sa, 0) < 0)
goto fail;
memcpy(&m.sockaddr, &sa, sizeof(struct sockaddr));
diff -ruNp linux-2.6-om/hpc/service.c linux-2.6-om-work/hpc/service.c
--- linux-2.6-om/hpc/service.c 2006-02-07 16:51:58.000000000 +0100
+++ linux-2.6-om-work/hpc/service.c 2006-03-24 18:36:26.000000000 +0100
@@ -131,7 +131,7 @@ int sockaddr_inherit(om_link_t *mlink, s
{
struct sockaddr tmp;
- if (comm_getname(mlink, &tmp) < 0)
+ if (comm_getname(mlink, &tmp, 0) < 0)
return -1;
memset(sa, 0, sizeof(struct sockaddr));
diff -ruNp linux-2.6-om/hpc/task.c linux-2.6-om-work/hpc/task.c
--- linux-2.6-om/hpc/task.c 2006-02-07 16:51:58.000000000 +0100
+++ linux-2.6-om-work/hpc/task.c 2006-03-24 18:36:26.000000000 +0100
@@ -130,7 +130,10 @@ void task_request_move(task_t *p)
addr = p->om.whereto;
p->om.whereto = NULL;
- task_move_to_node(p, addr, 0);
+ if (addr)
+ task_move_to_node(p, addr, 0);
+ else
+ task_go_home(p);
kfree(addr);
}
--
Ansgar Esztermann
Researcher & Sysadmin
http://www2.thphy.uni-duesseldorf.de/~ansgar
signature.asc
(application/pgp-signature, 191 B)
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2.2 (GNU/Linux) iD8DBQFEJDNUwAkt8h1/xRgRAkODAJwLBfabLr9v4zP7YPm1yLK7HjVp+wCeOvf/ VetBt0AYL33SnnYkkyVpv/A= =1wO6 -----END PGP SIGNATURE-----