Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 19 May 2018 00:47:25 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r333821 - projects/pnfs-planb-server/sys/fs/nfsserver
Message-ID:  <201805190047.w4J0lPCj019318@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Sat May 19 00:47:24 2018
New Revision: 333821
URL: https://svnweb.freebsd.org/changeset/base/333821

Log:
  Convert the pnfs create and remove operations for mirrored DSs to use
  taskqueue instead of kproc_create().

Modified:
  projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c

Modified: projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Sat May 19 00:26:00 2018	(r333820)
+++ projects/pnfs-planb-server/sys/fs/nfsserver/nfs_nfsdport.c	Sat May 19 00:47:24 2018	(r333821)
@@ -3668,14 +3668,16 @@ nfsrv_backupstable(void)
 /*
  * Create a DS data file for nfsrv_pnfscreate(). Called for each mirror.
  * The arguments are in a structure, so that they can be passed through
- * kproc_create() for a kernel process to execute this function.
+ * taskqueue for a kernel process to execute this function.
  */
 struct nfsrvdscreate {
+	int			done;
+	int			inprog;
+	struct task		tsk;
 	struct ucred		*tcred;
 	struct vnode		*dvp;
 	NFSPROC_T		*p;
 	struct pnfsdsfile	*pf;
-	int			haskproc;
 	int			err;
 	fhandle_t		fh;
 	struct vattr		va;
@@ -3776,18 +3778,15 @@ nfsrv_dscreate(struct vnode *dvp, struct vattr *vap, s
  * Start up the thread that will execute nfsrv_dscreate().
  */
 static void
-start_dscreate(void *arg)
+start_dscreate(void *arg, int pending)
 {
 	struct nfsrvdscreate *dsc;
 
 	dsc = (struct nfsrvdscreate *)arg;
 	dsc->err = nfsrv_dscreate(dsc->dvp, &dsc->createva, &dsc->va, &dsc->fh,
 	    dsc->pf, NULL, NULL, dsc->tcred, dsc->p, NULL);
-	NFSDSCLOCK();
-	dsc->haskproc = 0;
-	wakeup(dsc);
-	NFSDSCUNLOCK();
-	kproc_exit(0);
+	dsc->done = 1;
+	NFSD_DEBUG(4, "start_dscreate: err=%d\n", dsc->err);
 }
 
 /*
@@ -3810,8 +3809,8 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 	gid_t vagid;
 	u_short vamode;
 	struct ucred *tcred;
-	int dsdir[NFSDEV_MAXMIRRORS], error, haskproc, i, mirrorcnt, ret;
-	int failpos;
+	int dsdir[NFSDEV_MAXMIRRORS], error, i, mirrorcnt, ret;
+	int failpos, timo;
 
 	/* Get a DS server directory in a round-robin order. */
 	mirrorcnt = 1;
@@ -3868,7 +3867,6 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 	 * additional mirrors.
 	 */
 	failpos = -1;
-	haskproc = 0;
 	for (i = 0; i < mirrorcnt - 1 && error == 0; i++, tpf++, tdsc++) {
 		tpf->dsf_dir = dsdir[i];
 		tdsc->tcred = tcred;
@@ -3878,13 +3876,15 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 		tdsc->fh = fh;
 		tdsc->va = va;
 		tdsc->dvp = dvp[i];
-		tdsc->haskproc = 1;
-		ret = kproc_create(start_dscreate, (void *)tdsc, NULL, 0, 0,
-		    "nfsdpcr");
-		if (ret == 0)
-			haskproc = 1;
-		else {
-			tdsc->haskproc = 0;
+		tdsc->done = 0;
+		tdsc->inprog = 0;
+		tdsc->err = 0;
+		ret = EIO;
+		if (nfs_pnfsiothreads != 0) {
+			ret = nfs_pnfsio(start_dscreate, tdsc);
+			NFSD_DEBUG(4, "nfsrv_pnfscreate: nfs_pnfsio=%d\n", ret);
+		}
+		if (ret != 0) {
 			ret = nfsrv_dscreate(dvp[i], vap, &va, &fh, tpf, NULL,
 			    NULL, tcred, p, NULL);
 			if (ret != 0) {
@@ -3906,21 +3906,19 @@ nfsrv_pnfscreate(struct vnode *vp, struct vattr *vap, 
 			error = 0;
 		}
 	}
-	if (haskproc != 0) {
-		/* Wait for kernel proc(s) to complete. */
-		NFSDSCLOCK();
-		for (tdsc = dsc, i = 0; i < mirrorcnt - 1; i++, tdsc++) {
-			while (tdsc->haskproc != 0)
-				mtx_sleep(tdsc, NFSDSCLOCKMUTEXPTR, PVFS,
-				    "nfspcr", 0);
-			if (tdsc->err != 0) {
-				if (failpos == -1 && tdsc->err == ENXIO)
-					failpos = i;
-				else if (error == 0)
-					error = tdsc->err;
-			}
+	timo = hz / 50;		/* Wait for 20msec. */
+	if (timo < 1)
+		timo = 1;
+	/* Wait for kernel task(s) to complete. */
+	for (tdsc = dsc, i = 0; i < mirrorcnt - 1; i++, tdsc++) {
+		while (tdsc->inprog != 0 && tdsc->done == 0)
+			tsleep(&tdsc->tsk, PVFS, "srvdcr", timo);
+		if (tdsc->err != 0) {
+			if (failpos == -1 && tdsc->err == ENXIO)
+				failpos = i;
+			else if (error == 0)
+				error = tdsc->err;
 		}
-		NFSDSCUNLOCK();
 	}
 
 	/*
@@ -4014,13 +4012,15 @@ nfsrv_pnfsremovesetup(struct vnode *vp, NFSPROC_T *p, 
 /*
  * Remove a DS data file for nfsrv_pnfsremove(). Called for each mirror.
  * The arguments are in a structure, so that they can be passed through
- * kproc_create() for a kernel process to execute this function.
+ * taskqueue for a kernel process to execute this function.
  */
 struct nfsrvdsremove {
+	int			done;
+	int			inprog;
+	struct task		tsk;
 	struct ucred		*tcred;
 	struct vnode		*dvp;
 	NFSPROC_T		*p;
-	int			haskproc;
 	int			err;
 	char			fname[PNFS_FILENAME_LEN + 1];
 };
@@ -4061,18 +4061,15 @@ nfsrv_dsremove(struct vnode *dvp, char *fname, struct 
  * Start up the thread that will execute nfsrv_dsremove().
  */
 static void
-start_dsremove(void *arg)
+start_dsremove(void *arg, int pending)
 {
 	struct nfsrvdsremove *dsrm;
 
 	dsrm = (struct nfsrvdsremove *)arg;
 	dsrm->err = nfsrv_dsremove(dsrm->dvp, dsrm->fname, dsrm->tcred,
 	    dsrm->p);
-	NFSDSRMLOCK();
-	dsrm->haskproc = 0;
-	wakeup(dsrm);
-	NFSDSRMUNLOCK();
-	kproc_exit(0);
+	dsrm->done = 1;
+	NFSD_DEBUG(4, "start_dsremove: err=%d\n", dsrm->err);
 }
 
 /*
@@ -4087,7 +4084,7 @@ nfsrv_pnfsremove(struct vnode **dvp, int mirrorcnt, ch
 	struct nfsrvdsremove *dsrm, *tdsrm;
 	struct nfsdevice *ds;
 	struct nfsmount *nmp;
-	int failpos, haskproc, i, ret;
+	int failpos, i, ret, timo;
 
 	tcred = newnfs_getcred();
 	dsrm = NULL;
@@ -4098,19 +4095,20 @@ nfsrv_pnfsremove(struct vnode **dvp, int mirrorcnt, ch
 	 * additional mirrors.
 	 */
 	failpos = -1;
-	haskproc = 0;
 	for (tdsrm = dsrm, i = 0; i < mirrorcnt - 1; i++, tdsrm++) {
 		tdsrm->tcred = tcred;
 		tdsrm->p = p;
 		tdsrm->dvp = dvp[i];
 		strlcpy(tdsrm->fname, fname, PNFS_FILENAME_LEN + 1);
-		tdsrm->haskproc = 1;
-		ret = kproc_create(start_dsremove, (void *)tdsrm, NULL, 0, 0,
-		    "nfsdprm");
-		if (ret == 0)
-			haskproc = 1;
-		else {
-			tdsrm->haskproc = 0;
+		tdsrm->inprog = 0;
+		tdsrm->done = 0;
+		tdsrm->err = 0;
+		ret = EIO;
+		if (nfs_pnfsiothreads != 0) {
+			ret = nfs_pnfsio(start_dsremove, tdsrm);
+			NFSD_DEBUG(4, "nfsrv_pnfsremove: nfs_pnfsio=%d\n", ret);
+		}
+		if (ret != 0) {
 			ret = nfsrv_dsremove(dvp[i], fname, tcred, p);
 			if (failpos == -1 && ret == ENXIO)
 				failpos = i;
@@ -4119,17 +4117,15 @@ nfsrv_pnfsremove(struct vnode **dvp, int mirrorcnt, ch
 	ret = nfsrv_dsremove(dvp[mirrorcnt - 1], fname, tcred, p);
 	if (failpos == -1 && mirrorcnt > 1 && ret == ENXIO)
 		failpos = mirrorcnt - 1;
-	if (haskproc != 0) {
-		/* Wait for kernel proc(s) to complete. */
-		NFSDSRMLOCK();
-		for (tdsrm = dsrm, i = 0; i < mirrorcnt - 1; i++, tdsrm++) {
-			while (tdsrm->haskproc != 0)
-				mtx_sleep(tdsrm, NFSDSRMLOCKMUTEXPTR, PVFS,
-				    "nfsprm", 0);
-			if (failpos == -1 && tdsrm->err == ENXIO)
-				failpos = i;
-		}
-		NFSDSRMUNLOCK();
+	timo = hz / 50;		/* Wait for 20msec. */
+	if (timo < 1)
+		timo = 1;
+	/* Wait for kernel task(s) to complete. */
+	for (tdsrm = dsrm, i = 0; i < mirrorcnt - 1; i++, tdsrm++) {
+		while (tdsrm->inprog != 0 && tdsrm->done == 0)
+			tsleep(&tdsrm->tsk, PVFS, "srvdsrm", timo);
+		if (failpos == -1 && tdsrm->err == ENXIO)
+			failpos = i;
 	}
 
 	/*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201805190047.w4J0lPCj019318>