[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