linux-doc.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
To: Elliot Berman <quic_eberman@quicinc.com>,
	Bjorn Andersson <quic_bjorande@quicinc.com>,
	Alex Elder <elder@linaro.org>,
	Murali Nalajala <quic_mnalajal@quicinc.com>,
	Jonathan Corbet <corbet@lwn.net>
Cc: Trilok Soni <quic_tsoni@quicinc.com>,
	Srivatsa Vaddagiri <quic_svaddagi@quicinc.com>,
	Carl van Schaik <quic_cvanscha@quicinc.com>,
	Prakruthi Deepak Heragu <quic_pheragu@quicinc.com>,
	Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Rob Herring <robh+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Bagas Sanjaya <bagasdotme@gmail.com>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will@kernel.org>, Marc Zyngier <maz@kernel.org>,
	Jassi Brar <jassisinghbrar@gmail.com>,
	Sudeep Holla <sudeep.holla@arm.com>,
	linux-arm-msm@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v9 21/27] gunyah: vm_mgr: Add framework to add VM Functions
Date: Tue, 7 Feb 2023 13:15:32 +0000	[thread overview]
Message-ID: <c1564a80-d1be-f31d-2db3-1ec0b847e921@linaro.org> (raw)
In-Reply-To: <20230120224627.4053418-22-quic_eberman@quicinc.com>



On 20/01/2023 22:46, Elliot Berman wrote:
> Introduce a framework for Gunyah userspace to install VM functions. VM
> functions are optional interfaces to the virtual machine. vCPUs,
> ioeventfs, and irqfds are examples of such VM functions and are
> implemented in subsequent patches.
> 
> A generic framework is implemented instead of individual ioctls to
> create vCPUs, irqfds, etc., in order to simplify the VM manager core
> implementation and allow dynamic loading of VM function modules.
> 
> Signed-off-by: Elliot Berman <quic_eberman@quicinc.com>
> ---
>   Documentation/virt/gunyah/vm-manager.rst |  18 +++
>   drivers/virt/gunyah/vm_mgr.c             | 187 ++++++++++++++++++++++-
>   drivers/virt/gunyah/vm_mgr.h             |   5 +
>   include/linux/gunyah_vm_mgr.h            |  68 +++++++++
>   include/uapi/linux/gunyah.h              |  13 ++
>   5 files changed, 289 insertions(+), 2 deletions(-)
>   create mode 100644 include/linux/gunyah_vm_mgr.h
> 
> diff --git a/Documentation/virt/gunyah/vm-manager.rst b/Documentation/virt/gunyah/vm-manager.rst
> index 62513af09cbf..d929f8f20b3b 100644
> --- a/Documentation/virt/gunyah/vm-manager.rst
> +++ b/Documentation/virt/gunyah/vm-manager.rst
> @@ -17,6 +17,24 @@ sharing userspace memory with a VM is done via the GH_VM_SET_USER_MEM_REGION
>   ioctl. The VM itself is configured to use the memory region via the
>   devicetree.
>   
> +Gunyah Functions
> +================
> +
> +Components of a Gunyah VM's configuration that need kernel configuration are
> +called "functions" and are built on top of a framework. Functions are identified
> +by a string and have some argument(s) to configure them. They are typically
> +created by the `GH_VM_ADD_FUNCTION` ioctl.
> +
> +Functions typically will always do at least one of these operations:
> +
> +1. Create resource ticket(s). Resource tickets allow a function to register
> +   itself as the client for a Gunyah resource (e.g. doorbell or vCPU) and
> +   the function is given the pointer to the `struct gunyah_resource` when the
> +   VM is starting.
> +
> +2. Register IO handler(s). IO handlers allow a function to handle stage-2 faults
> +   from the virtual machine.
> +
>   Sample Userspace VMM
>   ====================
>   
> diff --git a/drivers/virt/gunyah/vm_mgr.c b/drivers/virt/gunyah/vm_mgr.c
> index 48bd3f06fb6c..1e795f3d19d5 100644
> --- a/drivers/virt/gunyah/vm_mgr.c
> +++ b/drivers/virt/gunyah/vm_mgr.c
> @@ -16,7 +16,147 @@
>   
>   #include "vm_mgr.h"
>   
> -static __must_check struct gunyah_vm *gunyah_vm_alloc(struct gh_rm_rpc *rm)
> +static DEFINE_MUTEX(functions_lock);
> +static LIST_HEAD(functions);
> +
> +static struct gunyah_vm_function_driver *__find_function(const char name[GUNYAH_FUNCTION_NAME_SIZE])
> +	__must_hold(functions_lock)
> +{
> +	struct gunyah_vm_function_driver *iter, *drv = NULL;
> +
> +	list_for_each_entry(iter, &functions, list) {
> +		if (!strncmp(iter->name, name, GUNYAH_FUNCTION_NAME_SIZE)) {
> +			drv = iter;
> +			break;
> +		}
> +	}
> +
> +	return drv;
> +}
> +
> +int gunyah_vm_function_register(struct gunyah_vm_function_driver *drv)
> +{
> +	int ret = 0;
> +
> +	mutex_lock(&functions_lock);
> +	if (__find_function(drv->name)) {
> +		ret = -EEXIST;
> +		goto out;
> +	}
> +
> +	INIT_LIST_HEAD(&drv->instances);
> +	list_add(&drv->list, &functions);
> +out:
> +	mutex_unlock(&functions_lock);
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(gunyah_vm_function_register);
> +
> +static void gh_vm_remove_function(struct gunyah_vm_function *f)
> +	__must_hold(functions_lock)
> +{
> +	f->drv->release(f);
> +	list_del(&f->vm_list);
> +	list_del(&f->drv_list);
> +	module_put(f->drv->mod);
> +	kfree(f);
> +}
> +
> +void gunyah_vm_function_unregister(struct gunyah_vm_function_driver *drv)
> +{
> +	struct gunyah_vm_function *f, *iter;
> +
> +	mutex_lock(&functions_lock);
> +	list_for_each_entry_safe(f, iter, &drv->instances, drv_list)
> +		gh_vm_remove_function(f);
> +	list_del(&drv->list);
> +	mutex_unlock(&functions_lock);
> +}
> +EXPORT_SYMBOL_GPL(gunyah_vm_function_unregister);
> +
> +static long gh_vm_add_function(struct gunyah_vm *ghvm, struct gunyah_vm_function *f)
> +{
> +	long r = 0;
> +
> +	mutex_lock(&functions_lock);
> +	f->drv = __find_function(f->fn.name);
> +	if (!f->drv) {
> +		mutex_unlock(&functions_lock);
> +		r = request_module("ghfunc:%s", f->fn.name);
> +		if (r)
> +			return r;
> +
> +		mutex_lock(&functions_lock);
> +		f->drv = __find_function(f->fn.name);
> +	}
> +
> +	if (!f->drv) {
> +		r = -ENOENT;
> +		goto out;
> +	}
> +
> +	if (!try_module_get(f->drv->mod)) {
> +		r = -ENOENT;
> +		f->drv = NULL;
> +		goto out;
> +	}
> +
> +	f->ghvm = ghvm;
> +	f->rm = ghvm->rm;
> +
> +	r = f->drv->bind(f);
> +	if (r < 0) {
> +		module_put(f->drv->mod);
> +		goto out;
> +	}
> +
> +	list_add(&f->vm_list, &ghvm->functions);
> +	list_add(&f->drv_list, &f->drv->instances);
> +out:
> +	mutex_unlock(&functions_lock);
> +	return r;
> +}
> +
> +static long gh_vm_rm_function(struct gunyah_vm *ghvm, struct gh_vm_function *fn)
> +{
> +	long r = 0;
> +	struct gunyah_vm_function *f, *iter;
> +
> +	r = mutex_lock_interruptible(&functions_lock);
> +	if (r)
> +		return r;
> +
> +	list_for_each_entry_safe(f, iter, &ghvm->functions, vm_list) {
> +		if (!memcmp(&f->fn, fn, sizeof(*fn)))
> +			gh_vm_remove_function(f);
> +	}
> +
> +	mutex_unlock(&functions_lock);
> +	return 0;
> +}
> +
> +static void ghvm_put(struct kref *kref)
> +{
> +	struct gunyah_vm *ghvm = container_of(kref, struct gunyah_vm, kref);
> +
> +	gh_rm_dealloc_vmid(ghvm->rm, ghvm->vmid);
> +	put_gh_rm(ghvm->rm);
> +	kfree(ghvm);
> +}
> +
> +int __must_check get_gunyah_vm(struct gunyah_vm *ghvm)
> +{
> +	return kref_get_unless_zero(&ghvm->kref);
> +}
> +EXPORT_SYMBOL_GPL(get_gunyah_vm);
> +
> +void put_gunyah_vm(struct gunyah_vm *ghvm)
> +{
> +	kref_put(&ghvm->kref, ghvm_put);
> +}
> +EXPORT_SYMBOL_GPL(put_gunyah_vm);
> +
> +static __must_check struct gunyah_vm *gunyah_vm_alloc(struct gh_rm *rm)
>   {
>   	struct gunyah_vm *ghvm;
>   	int vmid;
> @@ -39,6 +179,8 @@ static __must_check struct gunyah_vm *gunyah_vm_alloc(struct gh_rm_rpc *rm)
>   	mutex_init(&ghvm->mm_lock);
>   	INIT_LIST_HEAD(&ghvm->memory_mappings);
>   	init_rwsem(&ghvm->status_lock);
> +	kref_init(&ghvm->kref);
> +	INIT_LIST_HEAD(&ghvm->functions);
>   
>   	return ghvm;
>   }
> @@ -192,6 +334,39 @@ static long gh_vm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>   			r = -EINVAL;
>   		break;
>   	}
> +	case GH_VM_ADD_FUNCTION: {
> +		struct gunyah_vm_function *f;
> +
> +		r = -ENOMEM;
> +		f = kzalloc(sizeof(*f), GFP_KERNEL);
> +		if (!f)
> +			break;
> +
> +		r = -EFAULT;
> +		if (copy_from_user(&f->fn, argp, sizeof(f->fn)))
> +			break;
> +
> +		r = gh_vm_add_function(ghvm, f);
> +		if (r < 0)
> +			kfree(f);
> +		break;
> +	}
> +	case GH_VM_REMOVE_FUNCTION: {
> +		struct gh_vm_function *fn;
> +
> +		r = -ENOMEM;
> +		fn = kzalloc(sizeof(*fn), GFP_KERNEL);
> +		if (!fn)
> +			break;
> +
> +		r = -EFAULT;
> +		if (copy_from_user(fn, argp, sizeof(*fn)))
> +			break;
> +
> +		r = gh_vm_rm_function(ghvm, fn);
> +		kfree(fn);
> +		break;
> +	}
>   	default:
>   		r = -ENOTTY;
>   		break;
> @@ -204,15 +379,23 @@ static int gh_vm_release(struct inode *inode, struct file *filp)
>   {
>   	struct gunyah_vm *ghvm = filp->private_data;
>   	struct gunyah_vm_memory_mapping *mapping, *tmp;
> +	struct gunyah_vm_function *f, *fiter;
>   
>   	gh_vm_stop(ghvm);
>   
> +	mutex_lock(&functions_lock);
> +	list_for_each_entry_safe(f, fiter, &ghvm->functions, vm_list) {
> +		gh_vm_remove_function(f);
> +	}
> +	mutex_unlock(&functions_lock);
> +
>   	list_for_each_entry_safe(mapping, tmp, &ghvm->memory_mappings, list) {
>   		gh_vm_mem_mapping_reclaim(ghvm, mapping);
>   		kfree(mapping);
>   	}
> +
>   	put_gh_rm(ghvm->rm);
> -	kfree(ghvm);
> +	put_gunyah_vm(ghvm);
>   	return 0;
>   }
>   
> diff --git a/drivers/virt/gunyah/vm_mgr.h b/drivers/virt/gunyah/vm_mgr.h
> index 5c02fb305893..8d3b0678fb96 100644
> --- a/drivers/virt/gunyah/vm_mgr.h
> +++ b/drivers/virt/gunyah/vm_mgr.h
> @@ -8,6 +8,7 @@
>   
>   #include <linux/gunyah_rsc_mgr.h>
>   #include <linux/list.h>
> +#include <linux/kref.h>
>   #include <linux/miscdevice.h>
>   #include <linux/mutex.h>
>   #include <linux/rwsem.h>
> @@ -41,8 +42,12 @@ struct gunyah_vm {
>   	enum gh_rm_vm_status vm_status;
>   	struct rw_semaphore status_lock;
>   
> +	struct kref kref;
> +
>   	struct mutex mm_lock;
>   	struct list_head memory_mappings;
> +
> +	struct list_head functions;
>   };
>   
>   struct gunyah_vm_memory_mapping *gh_vm_mem_mapping_alloc(struct gunyah_vm *ghvm,
> diff --git a/include/linux/gunyah_vm_mgr.h b/include/linux/gunyah_vm_mgr.h
> new file mode 100644
> index 000000000000..69f98eb503e9
> --- /dev/null
> +++ b/include/linux/gunyah_vm_mgr.h
> @@ -0,0 +1,68 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
> + */
> +
> +#ifndef _GUNYAH_VM_MGR_H
> +#define _GUNYAH_VM_MGR_H
> +
> +#include <linux/compiler_types.h>
> +#include <linux/gunyah.h>
> +#include <linux/gunyah_rsc_mgr.h>
> +#include <linux/list.h>
> +#include <linux/mod_devicetable.h>
> +#include <linux/notifier.h>
> +
> +#include <uapi/linux/gunyah.h>
> +
> +struct gunyah_vm;
> +
> +int __must_check get_gunyah_vm(struct gunyah_vm *ghvm);
> +void put_gunyah_vm(struct gunyah_vm *ghvm);
> +
> +struct gunyah_vm_function;
> +struct gunyah_vm_function_driver {
> +	const char name[GUNYAH_FUNCTION_NAME_SIZE];
> +	struct module *mod;
> +	long (*bind)(struct gunyah_vm_function *f);
> +	void (*release)(struct gunyah_vm_function *f);
> +	struct list_head list;
> +	struct list_head instances;
> +};
> +
> +struct gunyah_vm_function {
> +	struct gh_vm_function fn;
> +	struct gunyah_vm *ghvm;
> +	struct gh_rm *rm;
> +	struct gunyah_vm_function_driver *drv;
> +	void *data;
> +	struct list_head vm_list;
> +	struct list_head drv_list;
> +};
> +
> +int gunyah_vm_function_register(struct gunyah_vm_function_driver *f);
> +void gunyah_vm_function_unregister(struct gunyah_vm_function_driver *f);
> +
> +#define DECLARE_GUNYAH_VM_FUNCTION(_name, _bind, _release)		\
> +	static struct gunyah_vm_function_driver _name = {		\
> +		.name = __stringify(_name),				\
> +		.mod = THIS_MODULE,					\
> +		.bind = _bind,						\
> +		.release = _release,					\
> +	};								\
> +	MODULE_ALIAS("ghfunc:"__stringify(_name))

lets not over kill this by having DECLARE_GUNYAH_VM_FUNCTION, this will 
make the drivers readable in a more familar way. let the driver define 
this static struct.


> +
> +#define DECLARE_GUNYAH_VM_FUNCTION_INIT(_name, _bind, _release)		\
> +	DECLARE_GUNYAH_VM_FUNCTION(_name, _bind, _release);		\
> +	static int __init _name##_mod_init(void)			\
> +	{								\
> +		return gunyah_vm_function_register(&(_name));		\
> +	}								\
> +	module_init(_name##_mod_init);					\
> +	static void __exit _name##_mod_exit(void)			\
> +	{								\
> +		gunyah_vm_function_unregister(&(_name));		\
> +	}								\
> +	module_exit(_name##_mod_exit)
> +

How about:

#define module_gunyah_function_driver(__gf_driver)
         module_driver(__gf_driver, gunyah_vm_function_register, \
                         gunyah_vm_function_unregister)

Having relook at the patch, I think modeling the gunyah_vm_function as a 
proper device and driver model will scale, you could leverage most of 
this manual management to the existing driver model. May I suggest to 
you take a look at  include/linux/auxiliary_bus.h
with that you could model add_functions as
auxiliary_device_add and the respecitive drivers as module_auxiliary_driver.

> +#endif
> diff --git a/include/uapi/linux/gunyah.h b/include/uapi/linux/gunyah.h
> index 36359ad2175e..ec8da6fde045 100644
> --- a/include/uapi/linux/gunyah.h
> +++ b/include/uapi/linux/gunyah.h
> @@ -50,4 +50,17 @@ struct gh_vm_dtb_config {
>   
>   #define GH_VM_START		_IO(GH_IOCTL_TYPE, 0x3)
>   
> +#define GUNYAH_FUNCTION_NAME_SIZE		32
> +#define GUNYAH_FUNCTION_MAX_ARG_SIZE		1024
> +
> +struct gh_vm_function {
> +	char name[GUNYAH_FUNCTION_NAME_SIZE];
> +	union {
> +		char data[GUNYAH_FUNCTION_MAX_ARG_SIZE];

Are we missing any thing here, its odd to see a single member union like 
this.
if other memembers are part of another patch please move them to this 
one as its confusing.
> +	};
> +};
> +
> +#define GH_VM_ADD_FUNCTION	_IOW(GH_IOCTL_TYPE, 0x4, struct gh_vm_function)
> +#define GH_VM_REMOVE_FUNCTION	_IOW(GH_IOCTL_TYPE, 0x7, struct gh_vm_function)
> +
>   #endif

  parent reply	other threads:[~2023-02-07 13:16 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-20 22:45 [PATCH v9 00/27] Drivers for gunyah hypervisor Elliot Berman
2023-01-20 22:46 ` [PATCH v9 01/27] docs: gunyah: Introduce Gunyah Hypervisor Elliot Berman
2023-01-20 22:46 ` [PATCH v9 02/27] dt-bindings: Add binding for gunyah hypervisor Elliot Berman
2023-01-20 22:46 ` [PATCH v9 03/27] gunyah: Common types and error codes for Gunyah hypercalls Elliot Berman
2023-01-30  9:58   ` Greg Kroah-Hartman
2023-01-20 22:46 ` [PATCH v9 04/27] virt: gunyah: Add hypercalls to identify Gunyah Elliot Berman
2023-01-30 10:01   ` Greg Kroah-Hartman
2023-01-30 19:05     ` Elliot Berman
2023-01-20 22:46 ` [PATCH v9 05/27] virt: gunyah: Identify hypervisor version Elliot Berman
2023-01-20 22:46 ` [PATCH v9 06/27] mailbox: Allow direct registration to a channel Elliot Berman
2023-01-20 22:46 ` [PATCH v9 07/27] virt: gunyah: msgq: Add hypercalls to send and receive messages Elliot Berman
2023-01-31 16:16   ` Srinivas Kandagatla
2023-01-20 22:46 ` [PATCH v9 08/27] mailbox: Add Gunyah message queue mailbox Elliot Berman
2023-02-02  9:59   ` Srinivas Kandagatla
2023-02-06 14:00     ` Alex Elder
2023-02-08 20:46     ` Elliot Berman
2023-01-20 22:46 ` [PATCH v9 09/27] gunyah: rsc_mgr: Add resource manager RPC core Elliot Berman
2023-02-02 11:53   ` Srinivas Kandagatla
2023-02-06 14:14     ` Alex Elder
2023-01-20 22:46 ` [PATCH v9 10/27] gunyah: rsc_mgr: Add VM lifecycle RPC Elliot Berman
2023-01-25  6:12   ` Srivatsa Vaddagiri
2023-01-30 21:43     ` Elliot Berman
2023-02-02 12:46   ` Srinivas Kandagatla
2023-02-06 15:41     ` Alex Elder
2023-02-06 17:38       ` Elliot Berman
2023-01-20 22:46 ` [PATCH v9 11/27] gunyah: vm_mgr: Introduce basic VM Manager Elliot Berman
2023-02-02 12:54   ` Srinivas Kandagatla
2023-02-07  0:36     ` Elliot Berman
2023-01-20 22:46 ` [PATCH v9 12/27] gunyah: rsc_mgr: Add RPC for sharing memory Elliot Berman
2023-01-30 10:14   ` Srivatsa Vaddagiri
2023-01-30 21:45     ` Elliot Berman
2023-01-20 22:46 ` [PATCH v9 13/27] gunyah: vm_mgr: Add/remove user memory regions Elliot Berman
2023-01-25 13:34   ` Srivatsa Vaddagiri
2023-01-30 21:46     ` Elliot Berman
2023-02-06 16:12   ` Srinivas Kandagatla
2023-02-06 23:23     ` Elliot Berman
2023-01-20 22:46 ` [PATCH v9 14/27] gunyah: vm_mgr: Add ioctls to support basic non-proxy VM boot Elliot Berman
2023-01-30  8:53   ` Srivatsa Vaddagiri
2023-01-30 21:44     ` Elliot Berman
2023-01-30 21:45       ` Elliot Berman
2023-02-07 11:36   ` Srinivas Kandagatla
2023-02-08 21:04     ` Elliot Berman
2023-01-20 22:46 ` [PATCH v9 15/27] samples: Add sample userspace Gunyah VM Manager Elliot Berman
2023-01-20 22:46 ` [PATCH v9 16/27] gunyah: rsc_mgr: Add platform ops on mem_lend/mem_reclaim Elliot Berman
2023-01-20 22:46 ` [PATCH v9 17/27] firmware: qcom_scm: Use fixed width src vm bitmap Elliot Berman
2023-03-16  3:21   ` (subset) " Bjorn Andersson
2023-01-20 22:46 ` [PATCH v9 18/27] firmware: qcom_scm: Register Gunyah platform ops Elliot Berman
2023-01-31 15:18   ` Srivatsa Vaddagiri
2023-02-07 11:52   ` Srinivas Kandagatla
2023-02-08  1:06     ` Elliot Berman
2023-01-20 22:46 ` [PATCH v9 19/27] docs: gunyah: Document Gunyah VM Manager Elliot Berman
2023-01-20 22:46 ` [PATCH v9 20/27] virt: gunyah: Translate gh_rm_hyp_resource into gunyah_resource Elliot Berman
2023-01-20 22:46 ` [PATCH v9 21/27] gunyah: vm_mgr: Add framework to add VM Functions Elliot Berman
2023-02-03  9:37   ` Srivatsa Vaddagiri
2023-02-03 17:56     ` Srivatsa Vaddagiri
2023-02-07 13:15   ` Srinivas Kandagatla [this message]
2023-02-08 19:34     ` Elliot Berman
2023-01-20 22:46 ` [PATCH v9 22/27] virt: gunyah: Add resource tickets Elliot Berman
2023-02-06  9:50   ` Srivatsa Vaddagiri
2023-02-06 21:30     ` Elliot Berman
2023-01-20 22:46 ` [PATCH v9 23/27] virt: gunyah: Add IO handlers Elliot Berman
2023-02-06 10:46   ` Srivatsa Vaddagiri
2023-02-07  3:59     ` Elliot Berman
2023-02-07 12:19       ` Srivatsa Vaddagiri
2023-01-20 22:46 ` [PATCH v9 24/27] virt: gunyah: Add proxy-scheduled vCPUs Elliot Berman
2023-02-07 14:43   ` Srinivas Kandagatla
2023-02-08 18:36     ` Elliot Berman
2023-02-09 10:39   ` Srivatsa Vaddagiri
2023-02-10  6:54     ` Srivatsa Vaddagiri
2023-02-10 17:09       ` Elliot Berman
2023-01-20 22:46 ` [PATCH v9 25/27] virt: gunyah: Add hypercalls for sending doorbell Elliot Berman
2023-01-20 22:46 ` [PATCH v9 26/27] virt: gunyah: Add irqfd interface Elliot Berman
2023-02-07 14:30   ` Srinivas Kandagatla
2023-02-13  8:11   ` Srivatsa Vaddagiri
2023-01-20 22:46 ` [PATCH v9 27/27] virt: gunyah: Add ioeventfd Elliot Berman
2023-02-07 14:19   ` Srinivas Kandagatla

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=c1564a80-d1be-f31d-2db3-1ec0b847e921@linaro.org \
    --to=srinivas.kandagatla@linaro.org \
    --cc=arnd@arndb.de \
    --cc=bagasdotme@gmail.com \
    --cc=catalin.marinas@arm.com \
    --cc=corbet@lwn.net \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.baryshkov@linaro.org \
    --cc=elder@linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jassisinghbrar@gmail.com \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maz@kernel.org \
    --cc=quic_bjorande@quicinc.com \
    --cc=quic_cvanscha@quicinc.com \
    --cc=quic_eberman@quicinc.com \
    --cc=quic_mnalajal@quicinc.com \
    --cc=quic_pheragu@quicinc.com \
    --cc=quic_svaddagi@quicinc.com \
    --cc=quic_tsoni@quicinc.com \
    --cc=robh+dt@kernel.org \
    --cc=sudeep.holla@arm.com \
    --cc=will@kernel.org \
    /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).