Re: [PATCH v13 08/24] gunyah: vm_mgr: Introduce basic VM Manager

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 5/9/23 3:47 PM, Elliot Berman wrote:
Gunyah VM manager is a kernel moduel which exposes an interface to
Gunyah userspace to load, run, and interact with other Gunyah virtual
machines. The interface is a character device at /dev/gunyah.

Add a basic VM manager driver. Upcoming patches will add more ioctls
into this driver.

Co-developed-by: Prakruthi Deepak Heragu <quic_pheragu@xxxxxxxxxxx>
Signed-off-by: Prakruthi Deepak Heragu <quic_pheragu@xxxxxxxxxxx>
Signed-off-by: Elliot Berman <quic_eberman@xxxxxxxxxxx>

I have a couple of comments, but regardless of how you respond
to them:

Reviewed-by: Alex Elder <elder@xxxxxxxxxx>

---
  .../userspace-api/ioctl/ioctl-number.rst      |  1 +
  drivers/virt/gunyah/Makefile                  |  2 +-
  drivers/virt/gunyah/rsc_mgr.c                 | 50 +++++++++-
  drivers/virt/gunyah/vm_mgr.c                  | 93 +++++++++++++++++++
  drivers/virt/gunyah/vm_mgr.h                  | 20 ++++
  include/uapi/linux/gunyah.h                   | 23 +++++
  6 files changed, 187 insertions(+), 2 deletions(-)
  create mode 100644 drivers/virt/gunyah/vm_mgr.c
  create mode 100644 drivers/virt/gunyah/vm_mgr.h
  create mode 100644 include/uapi/linux/gunyah.h

diff --git a/Documentation/userspace-api/ioctl/ioctl-number.rst b/Documentation/userspace-api/ioctl/ioctl-number.rst
index 176e8fc3f31b..396212e88f7d 100644
--- a/Documentation/userspace-api/ioctl/ioctl-number.rst
+++ b/Documentation/userspace-api/ioctl/ioctl-number.rst
@@ -137,6 +137,7 @@ Code  Seq#    Include File                                           Comments
  'F'   DD     video/sstfb.h                                           conflict!
  'G'   00-3F  drivers/misc/sgi-gru/grulib.h                           conflict!
  'G'   00-0F  xen/gntalloc.h, xen/gntdev.h                            conflict!
+'G'   00-0f  linux/gunyah.h                                          conflict!

The existing pattern throughout this file is to use capital A-F,
so I would follow that here.

Sort off related:  I prefer lower-case a-f in hexadecimal
numbers in code, and you use capitals (at least some of the
time).

  'H'   00-7F  linux/hiddev.h                                          conflict!
  'H'   00-0F  linux/hidraw.h                                          conflict!
  'H'   01     linux/mei.h                                             conflict!
diff --git a/drivers/virt/gunyah/Makefile b/drivers/virt/gunyah/Makefile
index 241bab357b86..e47e25895299 100644
--- a/drivers/virt/gunyah/Makefile
+++ b/drivers/virt/gunyah/Makefile
@@ -1,4 +1,4 @@
  # SPDX-License-Identifier: GPL-2.0
-gunyah-y += rsc_mgr.o rsc_mgr_rpc.o
+gunyah-y += rsc_mgr.o rsc_mgr_rpc.o vm_mgr.o
  obj-$(CONFIG_GUNYAH) += gunyah.o
diff --git a/drivers/virt/gunyah/rsc_mgr.c b/drivers/virt/gunyah/rsc_mgr.c
index 88b5beb1ea51..4f6f96bdcf3d 100644
--- a/drivers/virt/gunyah/rsc_mgr.c
+++ b/drivers/virt/gunyah/rsc_mgr.c
@@ -15,8 +15,10 @@
  #include <linux/completion.h>
  #include <linux/gunyah_rsc_mgr.h>
  #include <linux/platform_device.h>
+#include <linux/miscdevice.h>
#include "rsc_mgr.h"
+#include "vm_mgr.h"
#define RM_RPC_API_VERSION_MASK GENMASK(3, 0)
  #define RM_RPC_HEADER_WORDS_MASK	GENMASK(7, 4)
@@ -130,6 +132,7 @@ struct gh_rm_connection {
   * @cache: cache for allocating Tx messages
   * @send_lock: synchronization to allow only one request to be sent at a time
   * @nh: notifier chain for clients interested in RM notification messages
+ * @miscdev: /dev/gunyah
   */
  struct gh_rm {
  	struct device *dev;
@@ -146,6 +149,8 @@ struct gh_rm {
  	struct kmem_cache *cache;
  	struct mutex send_lock;
  	struct blocking_notifier_head nh;
+
+	struct miscdevice miscdev;
  };
/**
@@ -581,6 +586,33 @@ int gh_rm_notifier_unregister(struct gh_rm *rm, struct notifier_block *nb)
  }
  EXPORT_SYMBOL_GPL(gh_rm_notifier_unregister);
+struct device *gh_rm_get(struct gh_rm *rm)
+{
+	return get_device(rm->miscdev.this_device);
+}
+EXPORT_SYMBOL_GPL(gh_rm_get);
+
+void gh_rm_put(struct gh_rm *rm)
+{
+	put_device(rm->miscdev.this_device);
+}
+EXPORT_SYMBOL_GPL(gh_rm_put);
+
+static long gh_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+	struct miscdevice *miscdev = filp->private_data;
+	struct gh_rm *rm = container_of(miscdev, struct gh_rm, miscdev);
+
+	return gh_dev_vm_mgr_ioctl(rm, cmd, arg);
+}
+
+static const struct file_operations gh_dev_fops = {
+	.owner		= THIS_MODULE,
+	.unlocked_ioctl	= gh_dev_ioctl,
+	.compat_ioctl	= compat_ptr_ioctl,
+	.llseek		= noop_llseek,
+};
+
  static int gh_msgq_platform_probe_direction(struct platform_device *pdev, bool tx,
  					    struct gh_resource *ghrsc)
  {
@@ -665,7 +697,22 @@ static int gh_rm_drv_probe(struct platform_device *pdev)
  	rm->msgq_client.rx_callback = gh_rm_msgq_rx_data;
  	rm->msgq_client.tx_done = gh_rm_msgq_tx_done;
- return gh_msgq_init(&pdev->dev, &rm->msgq, &rm->msgq_client, &rm->tx_ghrsc, &rm->rx_ghrsc);
+	ret = gh_msgq_init(&pdev->dev, &rm->msgq, &rm->msgq_client, &rm->tx_ghrsc, &rm->rx_ghrsc);
+	if (ret)
+		goto err_cache;
+
+	rm->miscdev.name = "gunyah";
+	rm->miscdev.minor = MISC_DYNAMIC_MINOR;
+	rm->miscdev.fops = &gh_dev_fops;
+
+	ret = misc_register(&rm->miscdev);
+	if (ret)
+		goto err_msgq;
+
+	return 0;
+err_msgq:
+	mbox_free_channel(gh_msgq_chan(&rm->msgq));

I'm sure I've said this before.  I find it strange that you need
to call mbox_free_channel() here, when it's not obvious where the
client got bound to any mbox channel.  It seems like freeing the
channel should happen inside gh_msgq_remove().  But... perhaps
you previously explained to me why it's done this way.

+	gh_msgq_remove(&rm->msgq);
  err_cache:
  	kmem_cache_destroy(rm->cache);
  	return ret;
@@ -675,6 +722,7 @@ static int gh_rm_drv_remove(struct platform_device *pdev)
  {
  	struct gh_rm *rm = platform_get_drvdata(pdev);
+ misc_deregister(&rm->miscdev);
  	mbox_free_channel(gh_msgq_chan(&rm->msgq));
  	gh_msgq_remove(&rm->msgq);
  	kmem_cache_destroy(rm->cache);

. . .




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux