linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Uma Krishnan <ukrishn@linux.vnet.ibm.com>
To: linux-scsi@vger.kernel.org,
	James Bottomley <jejb@linux.vnet.ibm.com>,
	"Martin K. Petersen" <martin.petersen@oracle.com>,
	"Matthew R. Ochs" <mrochs@linux.vnet.ibm.com>,
	"Manoj N. Kumar" <manoj@linux.vnet.ibm.com>
Cc: linuxppc-dev@lists.ozlabs.org,
	Andrew Donnellan <andrew.donnellan@au1.ibm.com>,
	Frederic Barrat <fbarrat@linux.vnet.ibm.com>,
	Christophe Lombard <clombard@linux.vnet.ibm.com>
Subject: [PATCH 13/38] cxlflash: Support adapter file descriptors for OpenCXL
Date: Thu, 22 Feb 2018 16:24:26 -0600	[thread overview]
Message-ID: <1519338266-52253-1-git-send-email-ukrishn@linux.vnet.ibm.com> (raw)
In-Reply-To: <1519338010-51782-1-git-send-email-ukrishn@linux.vnet.ibm.com>

Allocate a file descriptor for an adapter context when requested. In order
to allocate inodes for the file descriptors, a pseudo filesystem is created
and used.

Signed-off-by: Uma Krishnan <ukrishn@linux.vnet.ibm.com>
---
 drivers/scsi/cxlflash/ocxl_hw.c | 200 ++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/cxlflash/ocxl_hw.h |   1 +
 2 files changed, 201 insertions(+)

diff --git a/drivers/scsi/cxlflash/ocxl_hw.c b/drivers/scsi/cxlflash/ocxl_hw.c
index 30db79d..ee3702d 100644
--- a/drivers/scsi/cxlflash/ocxl_hw.c
+++ b/drivers/scsi/cxlflash/ocxl_hw.c
@@ -12,13 +12,144 @@
  * 2 of the License, or (at your option) any later version.
  */
 
+#include <linux/file.h>
 #include <linux/idr.h>
+#include <linux/module.h>
+#include <linux/mount.h>
 
 #include <misc/ocxl.h>
 
 #include "backend.h"
 #include "ocxl_hw.h"
 
+/*
+ * Pseudo-filesystem to allocate inodes.
+ */
+
+#define OCXLFLASH_FS_MAGIC      0x1697698f
+
+static int ocxlflash_fs_cnt;
+static struct vfsmount *ocxlflash_vfs_mount;
+
+static const struct dentry_operations ocxlflash_fs_dops = {
+	.d_dname	= simple_dname,
+};
+
+/*
+ * ocxlflash_fs_mount() - mount the pseudo-filesystem
+ * @fs_type:	File system type.
+ * @flags:	Flags for the filesystem.
+ * @dev_name:	Device name associated with the filesystem.
+ * @data:	Data pointer.
+ *
+ * Return: pointer to the directory entry structure
+ */
+static struct dentry *ocxlflash_fs_mount(struct file_system_type *fs_type,
+					 int flags, const char *dev_name,
+					 void *data)
+{
+	return mount_pseudo(fs_type, "ocxlflash:", NULL, &ocxlflash_fs_dops,
+			    OCXLFLASH_FS_MAGIC);
+}
+
+static struct file_system_type ocxlflash_fs_type = {
+	.name		= "ocxlflash",
+	.owner		= THIS_MODULE,
+	.mount		= ocxlflash_fs_mount,
+	.kill_sb	= kill_anon_super,
+};
+
+/*
+ * ocxlflash_release_mapping() - release the memory mapping
+ * @ctx:	Context whose mapping is to be released.
+ */
+static void ocxlflash_release_mapping(struct ocxlflash_context *ctx)
+{
+	if (ctx->mapping)
+		simple_release_fs(&ocxlflash_vfs_mount, &ocxlflash_fs_cnt);
+	ctx->mapping = NULL;
+}
+
+/*
+ * ocxlflash_getfile() - allocate pseudo filesystem, inode, and the file
+ * @dev:	Generic device of the host.
+ * @name:	Name of the pseudo filesystem.
+ * @fops:	File operations.
+ * @priv:	Private data.
+ * @flags:	Flags for the file.
+ *
+ * Return: pointer to the file on success, ERR_PTR on failure
+ */
+static struct file *ocxlflash_getfile(struct device *dev, const char *name,
+				      const struct file_operations *fops,
+				      void *priv, int flags)
+{
+	struct qstr this;
+	struct path path;
+	struct file *file;
+	struct inode *inode = NULL;
+	int rc;
+
+	if (fops->owner && !try_module_get(fops->owner)) {
+		dev_err(dev, "%s: Owner does not exist\n", __func__);
+		rc = -ENOENT;
+		goto err1;
+	}
+
+	rc = simple_pin_fs(&ocxlflash_fs_type, &ocxlflash_vfs_mount,
+			   &ocxlflash_fs_cnt);
+	if (unlikely(rc < 0)) {
+		dev_err(dev, "%s: Cannot mount ocxlflash pseudofs rc=%d\n",
+			__func__, rc);
+		goto err2;
+	}
+
+	inode = alloc_anon_inode(ocxlflash_vfs_mount->mnt_sb);
+	if (IS_ERR(inode)) {
+		rc = PTR_ERR(inode);
+		dev_err(dev, "%s: alloc_anon_inode failed rc=%d\n",
+			__func__, rc);
+		goto err3;
+	}
+
+	this.name = name;
+	this.len = strlen(name);
+	this.hash = 0;
+	path.dentry = d_alloc_pseudo(ocxlflash_vfs_mount->mnt_sb, &this);
+	if (!path.dentry) {
+		dev_err(dev, "%s: d_alloc_pseudo failed\n", __func__);
+		rc = -ENOMEM;
+		goto err4;
+	}
+
+	path.mnt = mntget(ocxlflash_vfs_mount);
+	d_instantiate(path.dentry, inode);
+
+	file = alloc_file(&path, OPEN_FMODE(flags), fops);
+	if (IS_ERR(file)) {
+		rc = PTR_ERR(file);
+		dev_err(dev, "%s: alloc_file failed rc=%d\n",
+			__func__, rc);
+		goto err5;
+	}
+
+	file->f_flags = flags & (O_ACCMODE | O_NONBLOCK);
+	file->private_data = priv;
+out:
+	return file;
+err5:
+	path_put(&path);
+err4:
+	iput(inode);
+err3:
+	simple_release_fs(&ocxlflash_vfs_mount, &ocxlflash_fs_cnt);
+err2:
+	module_put(fops->owner);
+err1:
+	file = ERR_PTR(rc);
+	goto out;
+}
+
 /**
  * ocxlflash_set_master() - sets the context as master
  * @ctx_cookie:	Adapter context to set as master.
@@ -75,6 +206,7 @@ static void *ocxlflash_dev_context_init(struct pci_dev *pdev, void *afu_cookie)
 
 	ctx->pe = rc;
 	ctx->master = false;
+	ctx->mapping = NULL;
 	ctx->hw_afu = afu;
 out:
 	return ctx;
@@ -100,6 +232,7 @@ static int ocxlflash_release_context(void *ctx_cookie)
 		goto out;
 
 	idr_remove(&ctx->hw_afu->idr, ctx->pe);
+	ocxlflash_release_mapping(ctx);
 	kfree(ctx);
 out:
 	return rc;
@@ -262,6 +395,72 @@ static void *ocxlflash_create_afu(struct pci_dev *pdev)
 	goto out;
 }
 
+static const struct file_operations ocxl_afu_fops = {
+	.owner		= THIS_MODULE,
+};
+
+/**
+ * ocxlflash_get_fd() - get file descriptor for an adapter context
+ * @ctx_cookie:	Adapter context.
+ * @fops:	File operations to be associated.
+ * @fd:		File descriptor to be returned back.
+ *
+ * Return: pointer to the file on success, ERR_PTR on failure
+ */
+static struct file *ocxlflash_get_fd(void *ctx_cookie,
+				     struct file_operations *fops, int *fd)
+{
+	struct ocxlflash_context *ctx = ctx_cookie;
+	struct device *dev = ctx->hw_afu->dev;
+	struct file *file;
+	int flags, fdtmp;
+	int rc = 0;
+	char *name = NULL;
+
+	/* Only allow one fd per context */
+	if (ctx->mapping) {
+		dev_err(dev, "%s: Context is already mapped to an fd\n",
+			__func__);
+		rc = -EEXIST;
+		goto err1;
+	}
+
+	flags = O_RDWR | O_CLOEXEC;
+
+	/* This code is similar to anon_inode_getfd() */
+	rc = get_unused_fd_flags(flags);
+	if (unlikely(rc < 0)) {
+		dev_err(dev, "%s: get_unused_fd_flags failed rc=%d\n",
+			__func__, rc);
+		goto err1;
+	}
+	fdtmp = rc;
+
+	/* Use default ops if there is no fops */
+	if (!fops)
+		fops = (struct file_operations *)&ocxl_afu_fops;
+
+	name = kasprintf(GFP_KERNEL, "ocxlflash:%d", ctx->pe);
+	file = ocxlflash_getfile(dev, name, fops, ctx, flags);
+	kfree(name);
+	if (IS_ERR(file)) {
+		rc = PTR_ERR(file);
+		dev_err(dev, "%s: ocxlflash_getfile failed rc=%d\n",
+			__func__, rc);
+		goto err2;
+	}
+
+	ctx->mapping = file->f_mapping;
+	*fd = fdtmp;
+out:
+	return file;
+err2:
+	put_unused_fd(fdtmp);
+err1:
+	file = ERR_PTR(rc);
+	goto out;
+}
+
 /* Backend ops to ocxlflash services */
 const struct cxlflash_backend_ops cxlflash_ocxl_ops = {
 	.module			= THIS_MODULE,
@@ -271,4 +470,5 @@ const struct cxlflash_backend_ops cxlflash_ocxl_ops = {
 	.release_context	= ocxlflash_release_context,
 	.create_afu		= ocxlflash_create_afu,
 	.destroy_afu		= ocxlflash_destroy_afu,
+	.get_fd			= ocxlflash_get_fd,
 };
diff --git a/drivers/scsi/cxlflash/ocxl_hw.h b/drivers/scsi/cxlflash/ocxl_hw.h
index 49d5d08..7f234b1 100644
--- a/drivers/scsi/cxlflash/ocxl_hw.h
+++ b/drivers/scsi/cxlflash/ocxl_hw.h
@@ -32,6 +32,7 @@ struct ocxl_hw_afu {
 
 struct ocxlflash_context {
 	struct ocxl_hw_afu *hw_afu;	/* HW AFU back pointer */
+	struct address_space *mapping;	/* Mapping for pseudo filesystem */
 	bool master;			/* Whether this is a master context */
 	int pe;				/* Process element */
 };
-- 
2.1.0

  parent reply	other threads:[~2018-02-22 22:24 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-22 22:20 [PATCH 00/38] cxlflash: OpenCXL transport support Uma Krishnan
2018-02-22 22:21 ` [PATCH 01/38] cxlflash: Preserve number of interrupts for master contexts Uma Krishnan
2018-02-22 22:22 ` [PATCH 02/38] cxlflash: Avoid clobbering context control register value Uma Krishnan
2018-02-22 22:22 ` [PATCH 03/38] cxlflash: Add argument identifier names Uma Krishnan
2018-02-22 22:22 ` [PATCH 04/38] cxlflash: Introduce OpenCXL backend Uma Krishnan
2018-02-23  4:28   ` Andrew Donnellan
2018-02-23 19:36     ` Uma Krishnan
2018-02-22 22:23 ` [PATCH 05/38] cxlflash: Hardware AFU for OpenCXL Uma Krishnan
2018-02-22 22:23 ` [PATCH 06/38] cxlflash: Read host function configuration Uma Krishnan
2018-02-22 22:23 ` [PATCH 07/38] cxlflash: Setup function acTag range Uma Krishnan
2018-02-22 22:23 ` [PATCH 08/38] cxlflash: Read host AFU configuration Uma Krishnan
2018-02-22 22:23 ` [PATCH 09/38] cxlflash: Setup AFU acTag range Uma Krishnan
2018-02-22 22:24 ` [PATCH 10/38] cxlflash: Setup AFU PASID Uma Krishnan
2018-02-22 22:24 ` [PATCH 11/38] cxlflash: Adapter context support for OpenCXL Uma Krishnan
2018-02-22 22:24 ` [PATCH 12/38] cxlflash: Use IDR to manage adapter contexts Uma Krishnan
2018-02-22 22:24 ` Uma Krishnan [this message]
2018-02-22 22:24 ` [PATCH 14/38] cxlflash: Support adapter context discovery Uma Krishnan
2018-02-22 22:24 ` [PATCH 15/38] cxlflash: Support image reload policy modification Uma Krishnan
2018-02-22 22:24 ` [PATCH 16/38] cxlflash: MMIO map the AFU Uma Krishnan
2018-02-22 22:25 ` [PATCH 17/38] cxlflash: Support starting an adapter context Uma Krishnan
2018-02-22 22:25 ` [PATCH 18/38] cxlflash: Support process specific mappings Uma Krishnan
2018-02-22 22:25 ` [PATCH 19/38] cxlflash: Support AFU state toggling Uma Krishnan
2018-02-22 22:25 ` [PATCH 20/38] cxlflash: Support reading adapter VPD data Uma Krishnan
2018-02-22 22:25 ` [PATCH 21/38] cxlflash: Setup function OpenCXL link Uma Krishnan
2018-02-22 22:26 ` [PATCH 22/38] cxlflash: Setup OpenCXL transaction layer Uma Krishnan
2018-02-22 22:26 ` [PATCH 23/38] cxlflash: Support process element lifecycle Uma Krishnan
2018-02-22 22:26 ` [PATCH 24/38] cxlflash: Support AFU interrupt management Uma Krishnan
2018-02-22 22:26 ` [PATCH 25/38] cxlflash: Support AFU interrupt mapping and registration Uma Krishnan
2018-02-22 22:26 ` [PATCH 26/38] cxlflash: Support starting user contexts Uma Krishnan
2018-02-22 22:27 ` [PATCH 27/38] cxlflash: Support adapter context polling Uma Krishnan
2018-02-22 22:27 ` [PATCH 28/38] cxlflash: Support adapter context reading Uma Krishnan
2018-02-22 22:27 ` [PATCH 29/38] cxlflash: Support adapter context mmap and release Uma Krishnan
2018-02-22 22:27 ` [PATCH 30/38] cxlflash: Support file descriptor mapping Uma Krishnan
2018-02-22 22:27 ` [PATCH 31/38] cxlflash: Introduce object handle fop Uma Krishnan
2018-02-22 22:27 ` [PATCH 32/38] cxlflash: Setup LISNs for user contexts Uma Krishnan
2018-02-22 22:27 ` [PATCH 33/38] cxlflash: Setup LISNs for master contexts Uma Krishnan
2018-02-22 22:28 ` [PATCH 34/38] cxlflash: Update synchronous interrupt status bits Uma Krishnan
2018-02-22 22:28 ` [PATCH 35/38] cxlflash: Introduce OCXL context state machine Uma Krishnan
2018-02-22 22:28 ` [PATCH 36/38] cxlflash: Register for translation errors Uma Krishnan
2018-02-22 22:28 ` [PATCH 37/38] cxlflash: Support AFU reset Uma Krishnan
2018-02-22 22:28 ` [PATCH 38/38] cxlflash: Enable OpenCXL operations Uma Krishnan
2018-02-23  4:13 ` [PATCH 00/38] cxlflash: OpenCXL transport support Andrew Donnellan
2018-02-23 18:05   ` Uma Krishnan
2018-02-23 19:38   ` Uma Krishnan
2018-02-26 14:43 ` Matthew R. Ochs

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1519338266-52253-1-git-send-email-ukrishn@linux.vnet.ibm.com \
    --to=ukrishn@linux.vnet.ibm.com \
    --cc=andrew.donnellan@au1.ibm.com \
    --cc=clombard@linux.vnet.ibm.com \
    --cc=fbarrat@linux.vnet.ibm.com \
    --cc=jejb@linux.vnet.ibm.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=manoj@linux.vnet.ibm.com \
    --cc=martin.petersen@oracle.com \
    --cc=mrochs@linux.vnet.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).