[SSI] openssi/kernel/cluster/ssi/vproc rproc_cli_vproc.c, 1.13, 1.14
Roger Tsang <[email protected]> Tue, 05 Jul 2011 22:12:05 +0000
| Newsgroups | gmane.linux.cluster.ssic.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/vproc
In directory vz-cvs-3.sog:/tmp/cvs-serv5680/cluster/ssi/vproc
Modified Files:
Tag: OPENSSI-FC
rproc_cli_vproc.c
Log Message:
- cli_rfork, cli_rexecve, cli_migrate: optimize away kmalloc()/kfree() dance when -ERFB_TRYAGAIN encountered.
- cli_rexecve: fix returning sucess when failed to allocate rvp_vproc_data structure.
- cli_migrate: zero out the rvp_vproc_data structure.
Index: rproc_cli_vproc.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/vproc/rproc_cli_vproc.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- rproc_cli_vproc.c 9 Nov 2010 02:08:51 -0000 1.13
+++ rproc_cli_vproc.c 5 Jul 2011 22:12:03 -0000 1.14
@@ -46,7 +46,7 @@
int remote_flags)
{
rvp_remote_data rf_data;
- rvp_vproc_data *vp_datap;
+ rvp_vproc_data *vp_datap = NULL;
struct vproc *vc = NULL;
struct pvproc *pvp = PVP(vp);
struct pvproc *pvc;
@@ -112,7 +112,14 @@
goto out;
}
- vp_datap = kzmalloc_nofail(sizeof(rvp_vproc_data));
+ if (vp_datap == NULL)
+ vp_datap = kmalloc(sizeof(rvp_vproc_data), GFP_KERNEL);
+ if (unlikely(vp_datap == NULL)) {
+ rfork_pproc_remove_msg(&rf_data, vp_flags);
+ error = -ENOMEM;
+ goto out;
+ }
+ bzero(vp_datap, sizeof(*vp_datap));
rf_data.rd_vproc_data = vp_datap;
vp_datap->rpvp_flag = pvp->pvp_flag; /* cur proc flags */
@@ -133,7 +140,6 @@
((CLONE_PTRACE & remote_flags) ?
(vp_flags | CLONE_PTRACE) : vp_flags));
- kfree((caddr_t)vp_datap);
rfork_pproc_remove_msg(&rf_data, vp_flags);
if (error == -ERFB_TRYAGAIN) {
@@ -142,6 +148,8 @@
*/
goto retry;
}
+ kfree((void *)vp_datap);
+ vp_datap = NULL;
if (error)
goto out;
@@ -201,7 +209,8 @@
pvc->pvp_oppid = 0; /* clear original parent */
out:
-
+ if (vp_datap)
+ kfree((void *)vp_datap);
VPROC_UNLOCK_EXCL(vp, "rfork: parent");
return error;
}
@@ -217,7 +226,7 @@
struct pt_regs *regs) /* Kernel-mode Address */
{
rvp_remote_data re_data;
- rvp_vproc_data *vp_datap;
+ rvp_vproc_data *vp_datap = NULL;
struct pvproc *pve = PVP(ve);
#ifdef VPROC_PVP_CHILD_LL
struct pvproc *pvc, *n;
@@ -276,12 +285,14 @@
rexecve_pproc_remove_msg(&re_data, error);
+ if (vp_datap)
+ kfree((void *)vp_datap);
return error;
}
- vp_datap = (rvp_vproc_data *)kmalloc(sizeof(rvp_vproc_data),
+ if (vp_datap == NULL)
+ vp_datap = (rvp_vproc_data *)kmalloc(sizeof(rvp_vproc_data),
GFP_KERNEL);
-
if (vp_datap == NULL) {
VPROC_UNLOCK_PGRP_LIST_EXCL(ve, "rexecve");
VPROC_UNLOCK_SESSION_LIST_EXCL(ve, "rexecve");
@@ -289,8 +300,7 @@
VPROC_END_MOVEMENT(ve, "rexecve");
rexecve_pproc_remove_msg(&re_data, 1);
-
- return error;
+ return -ENOMEM;
}
bzero(vp_datap, sizeof(rvp_vproc_data));
@@ -340,7 +350,6 @@
* Cleanup and reclaim memory associated with the rpc message.
*/
rmv_relation_info_from_msg(vp_datap);
- kfree((void *)vp_datap);
rexecve_pproc_remove_msg(&re_data, error);
if (error == -ERFB_TRYAGAIN) {
@@ -349,6 +358,8 @@
*/
goto retry;
}
+ kfree((void *)vp_datap);
+
/*
* Handle error return from PVPSOP_REXECVE()
*/
@@ -505,7 +516,7 @@
struct move_data *d)
{
rvp_remote_data mi_data;
- rvp_vproc_data *vp_datap;
+ rvp_vproc_data *vp_datap = NULL;
struct pvproc *pvm = PVP(vm);
#ifdef VPROC_PVP_CHILD_LL
struct pvproc *pvc, *n;
@@ -543,7 +554,6 @@
VPROC_UNLOCK_SESSION_LIST_EXCL(vm, "migrate");
VPROC_UNLOCK_EXCL(vm, "migrate");
VPROC_END_MOVEMENT(vm, "migrate");
-
return error;
}
@@ -561,12 +571,23 @@
VPROC_END_MOVEMENT(vm, "migrate");
migrate_pproc_remove_msg(&mi_data, error);
-
+ if (vp_datap)
+ kfree((void *)vp_datap);
return error;
}
- vp_datap = kmalloc_nofail(sizeof(*vp_datap));
+ if (vp_datap == NULL)
+ vp_datap = kmalloc(sizeof(*vp_datap), GFP_KERNEL);
+ if (unlikely(vp_datap == NULL)) {
+ VPROC_UNLOCK_PGRP_LIST_EXCL(vm, "migrate");
+ VPROC_UNLOCK_SESSION_LIST_EXCL(vm, "migrate");
+ VPROC_UNLOCK_EXCL(vm, "migrate");
+ VPROC_END_MOVEMENT(vm, "migrate");
+ migrate_pproc_remove_msg(&mi_data, error);
+ return -ENOMEM;
+ }
+ bzero(vp_datap, sizeof(*vp_datap));
mi_data.rd_vproc_data = vp_datap;
vp_datap->rpvp_pid = vm->vp_pid; /* current pid */
@@ -612,7 +633,6 @@
* Cleanup and reclaim memory associated with the rpc message.
*/
rmv_relation_info_from_msg(vp_datap);
- kfree((caddr_t)vp_datap);
migrate_pproc_remove_msg(&mi_data, error);
if (error == -ERFB_TRYAGAIN) {
@@ -621,6 +641,7 @@
*/
goto retry;
}
+ kfree((void *)vp_datap);
/*
* Handle error return from PVPSOP_MIGRATE()
------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security
threats, fraudulent activity, and more. Splunk takes this data and makes
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2