All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexandru Elisei <alexandru.elisei@arm.com>
To: Andre Przywara <andre.przywara@arm.com>,
	Will Deacon <will@kernel.org>,
	Julien Thierry <julien.thierry.kdev@gmail.com>
Cc: linux-arm-kernel@lists.infradead.org,
	Marc Zyngier <maz@kernel.org>,
	kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org
Subject: Re: [PATCH kvmtool 19/21] Remove ioport specific routines
Date: Wed, 17 Feb 2021 16:11:51 +0000	[thread overview]
Message-ID: <389aa087-b079-cafb-b018-eab599e337ed@arm.com> (raw)
In-Reply-To: <05a0df3a-625f-74de-8014-e78aee9e8427@arm.com>

Hi Andre,

On 2/17/21 3:49 PM, Alexandru Elisei wrote:
> Hi Andre,
>
> On 12/10/20 2:29 PM, Andre Przywara wrote:
>> Now that all users of the dedicated ioport trap handler interface are
>> gone, we can retire the code associated with it.
>>
>> This removes ioport.c and ioport.h, along with removing prototypes from
>> other header files.
>>
>> This also transfers the responsibility for port I/O trap handling
>> entirely into the new routine in mmio.c.
>>
>> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
>> ---
>>  Makefile             |   1 -
>>  include/kvm/ioport.h |  20 -----
>>  include/kvm/kvm.h    |   2 -
>>  ioport.c             | 173 -------------------------------------------
>>  mmio.c               |   2 +-
>>  5 files changed, 1 insertion(+), 197 deletions(-)
>>  delete mode 100644 ioport.c
>>
>> diff --git a/Makefile b/Makefile
>> index 35bb1182..94ff5da6 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -56,7 +56,6 @@ OBJS	+= framebuffer.o
>>  OBJS	+= guest_compat.o
>>  OBJS	+= hw/rtc.o
>>  OBJS	+= hw/serial.o
>> -OBJS	+= ioport.o
>>  OBJS	+= irq.o
>>  OBJS	+= kvm-cpu.o
>>  OBJS	+= kvm.o
>> diff --git a/include/kvm/ioport.h b/include/kvm/ioport.h
>> index a61038e2..38636553 100644
>> --- a/include/kvm/ioport.h
>> +++ b/include/kvm/ioport.h
>> @@ -17,28 +17,8 @@
>>  
>>  struct kvm;
> Looks to me like the above forward declaration can be removed; same for all the
> includes except linux/byteorder.h, needed for the lexx_to_cpu/cpu_to_lexx
> functions, and linux/types.h for the uxx typedefs. Otherwise looks good.

Actually, ignore the part about removing the includes, it opens a new can of worms
- byteorder.h doesn't include compiler.h where __always_inline is defined, and
various files where struct kvm_cpu is used don't include kvm-cpu.h (like pci.c,
hw/serial.c, etc). The header removal is not trivial and I think it should be part
of another cleanup patch.

Thanks,

Alex

>
> Thanks,
>
> Alex
>
>>  
>> -struct ioport {
>> -	struct rb_int_node		node;
>> -	struct ioport_operations	*ops;
>> -	void				*priv;
>> -	struct device_header		dev_hdr;
>> -	u32				refcount;
>> -	bool				remove;
>> -};
>> -
>> -struct ioport_operations {
>> -	bool (*io_in)(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size);
>> -	bool (*io_out)(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size);
>> -};
>> -
>>  void ioport__map_irq(u8 *irq);
>>  
>> -int __must_check ioport__register(struct kvm *kvm, u16 port, struct ioport_operations *ops,
>> -				  int count, void *param);
>> -int ioport__unregister(struct kvm *kvm, u16 port);
>> -int ioport__init(struct kvm *kvm);
>> -int ioport__exit(struct kvm *kvm);
>> -
>>  static inline u8 ioport__read8(u8 *data)
>>  {
>>  	return *data;
>> diff --git a/include/kvm/kvm.h b/include/kvm/kvm.h
>> index 14f9d58b..e70f8ef6 100644
>> --- a/include/kvm/kvm.h
>> +++ b/include/kvm/kvm.h
>> @@ -119,8 +119,6 @@ void kvm__irq_line(struct kvm *kvm, int irq, int level);
>>  void kvm__irq_trigger(struct kvm *kvm, int irq);
>>  bool kvm__emulate_io(struct kvm_cpu *vcpu, u16 port, void *data, int direction, int size, u32 count);
>>  bool kvm__emulate_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, u32 len, u8 is_write);
>> -bool kvm__emulate_pio(struct kvm_cpu *vcpu, u16 port, void *data,
>> -		      int direction, int size, u32 count);
>>  int kvm__destroy_mem(struct kvm *kvm, u64 guest_phys, u64 size, void *userspace_addr);
>>  int kvm__register_mem(struct kvm *kvm, u64 guest_phys, u64 size, void *userspace_addr,
>>  		      enum kvm_mem_type type);
>> diff --git a/ioport.c b/ioport.c
>> deleted file mode 100644
>> index 204d8103..00000000
>> --- a/ioport.c
>> +++ /dev/null
>> @@ -1,173 +0,0 @@
>> -#include "kvm/ioport.h"
>> -
>> -#include "kvm/kvm.h"
>> -#include "kvm/util.h"
>> -#include "kvm/rbtree-interval.h"
>> -#include "kvm/mutex.h"
>> -
>> -#include <linux/kvm.h>	/* for KVM_EXIT_* */
>> -#include <linux/types.h>
>> -
>> -#include <stdbool.h>
>> -#include <limits.h>
>> -#include <stdlib.h>
>> -#include <stdio.h>
>> -
>> -#define ioport_node(n) rb_entry(n, struct ioport, node)
>> -
>> -static DEFINE_MUTEX(ioport_lock);
>> -
>> -static struct rb_root		ioport_tree = RB_ROOT;
>> -
>> -static struct ioport *ioport_search(struct rb_root *root, u64 addr)
>> -{
>> -	struct rb_int_node *node;
>> -
>> -	node = rb_int_search_single(root, addr);
>> -	if (node == NULL)
>> -		return NULL;
>> -
>> -	return ioport_node(node);
>> -}
>> -
>> -static int ioport_insert(struct rb_root *root, struct ioport *data)
>> -{
>> -	return rb_int_insert(root, &data->node);
>> -}
>> -
>> -static void ioport_remove(struct rb_root *root, struct ioport *data)
>> -{
>> -	rb_int_erase(root, &data->node);
>> -}
>> -
>> -static struct ioport *ioport_get(struct rb_root *root, u64 addr)
>> -{
>> -	struct ioport *ioport;
>> -
>> -	mutex_lock(&ioport_lock);
>> -	ioport = ioport_search(root, addr);
>> -	if (ioport)
>> -		ioport->refcount++;
>> -	mutex_unlock(&ioport_lock);
>> -
>> -	return ioport;
>> -}
>> -
>> -/* Called with ioport_lock held. */
>> -static void ioport_unregister(struct rb_root *root, struct ioport *data)
>> -{
>> -	ioport_remove(root, data);
>> -	free(data);
>> -}
>> -
>> -static void ioport_put(struct rb_root *root, struct ioport *data)
>> -{
>> -	mutex_lock(&ioport_lock);
>> -	data->refcount--;
>> -	if (data->remove && data->refcount == 0)
>> -		ioport_unregister(root, data);
>> -	mutex_unlock(&ioport_lock);
>> -}
>> -
>> -int ioport__register(struct kvm *kvm, u16 port, struct ioport_operations *ops, int count, void *param)
>> -{
>> -	struct ioport *entry;
>> -	int r;
>> -
>> -	entry = malloc(sizeof(*entry));
>> -	if (entry == NULL)
>> -		return -ENOMEM;
>> -
>> -	*entry = (struct ioport) {
>> -		.node		= RB_INT_INIT(port, port + count),
>> -		.ops		= ops,
>> -		.priv		= param,
>> -		/*
>> -		 * Start from 0 because ioport__unregister() doesn't decrement
>> -		 * the reference count.
>> -		 */
>> -		.refcount	= 0,
>> -		.remove		= false,
>> -	};
>> -
>> -	mutex_lock(&ioport_lock);
>> -	r = ioport_insert(&ioport_tree, entry);
>> -	if (r < 0)
>> -		goto out_free;
>> -	mutex_unlock(&ioport_lock);
>> -
>> -	return port;
>> -
>> -out_free:
>> -	free(entry);
>> -	mutex_unlock(&ioport_lock);
>> -	return r;
>> -}
>> -
>> -int ioport__unregister(struct kvm *kvm, u16 port)
>> -{
>> -	struct ioport *entry;
>> -
>> -	mutex_lock(&ioport_lock);
>> -	entry = ioport_search(&ioport_tree, port);
>> -	if (!entry) {
>> -		mutex_unlock(&ioport_lock);
>> -		return -ENOENT;
>> -	}
>> -	/* The same reasoning from kvm__deregister_mmio() applies. */
>> -	if (entry->refcount == 0)
>> -		ioport_unregister(&ioport_tree, entry);
>> -	else
>> -		entry->remove = true;
>> -	mutex_unlock(&ioport_lock);
>> -
>> -	return 0;
>> -}
>> -
>> -static const char *to_direction(int direction)
>> -{
>> -	if (direction == KVM_EXIT_IO_IN)
>> -		return "IN";
>> -	else
>> -		return "OUT";
>> -}
>> -
>> -static void ioport_error(u16 port, void *data, int direction, int size, u32 count)
>> -{
>> -	fprintf(stderr, "IO error: %s port=%x, size=%d, count=%u\n", to_direction(direction), port, size, count);
>> -}
>> -
>> -bool kvm__emulate_io(struct kvm_cpu *vcpu, u16 port, void *data, int direction, int size, u32 count)
>> -{
>> -	struct ioport_operations *ops;
>> -	bool ret = false;
>> -	struct ioport *entry;
>> -	void *ptr = data;
>> -	struct kvm *kvm = vcpu->kvm;
>> -
>> -	entry = ioport_get(&ioport_tree, port);
>> -	if (!entry)
>> -		return kvm__emulate_pio(vcpu, port, data, direction,
>> -					size, count);
>> -
>> -	ops	= entry->ops;
>> -
>> -	while (count--) {
>> -		if (direction == KVM_EXIT_IO_IN && ops->io_in)
>> -				ret = ops->io_in(entry, vcpu, port, ptr, size);
>> -		else if (direction == KVM_EXIT_IO_OUT && ops->io_out)
>> -				ret = ops->io_out(entry, vcpu, port, ptr, size);
>> -
>> -		ptr += size;
>> -	}
>> -
>> -	ioport_put(&ioport_tree, entry);
>> -
>> -	if (ret)
>> -		return true;
>> -
>> -	if (kvm->cfg.ioport_debug)
>> -		ioport_error(port, data, direction, size, count);
>> -
>> -	return !kvm->cfg.ioport_debug;
>> -}
>> diff --git a/mmio.c b/mmio.c
>> index 4cce1901..5249af39 100644
>> --- a/mmio.c
>> +++ b/mmio.c
>> @@ -206,7 +206,7 @@ out:
>>  	return true;
>>  }
>>  
>> -bool kvm__emulate_pio(struct kvm_cpu *vcpu, u16 port, void *data,
>> +bool kvm__emulate_io(struct kvm_cpu *vcpu, u16 port, void *data,
>>  		     int direction, int size, u32 count)
>>  {
>>  	struct mmio_mapping *mmio;
> _______________________________________________
> kvmarm mailing list
> kvmarm@lists.cs.columbia.edu
> https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

WARNING: multiple messages have this Message-ID (diff)
From: Alexandru Elisei <alexandru.elisei@arm.com>
To: Andre Przywara <andre.przywara@arm.com>,
	Will Deacon <will@kernel.org>,
	Julien Thierry <julien.thierry.kdev@gmail.com>
Cc: Marc Zyngier <maz@kernel.org>,
	kvmarm@lists.cs.columbia.edu,
	linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org
Subject: Re: [PATCH kvmtool 19/21] Remove ioport specific routines
Date: Wed, 17 Feb 2021 16:11:51 +0000	[thread overview]
Message-ID: <389aa087-b079-cafb-b018-eab599e337ed@arm.com> (raw)
In-Reply-To: <05a0df3a-625f-74de-8014-e78aee9e8427@arm.com>

Hi Andre,

On 2/17/21 3:49 PM, Alexandru Elisei wrote:
> Hi Andre,
>
> On 12/10/20 2:29 PM, Andre Przywara wrote:
>> Now that all users of the dedicated ioport trap handler interface are
>> gone, we can retire the code associated with it.
>>
>> This removes ioport.c and ioport.h, along with removing prototypes from
>> other header files.
>>
>> This also transfers the responsibility for port I/O trap handling
>> entirely into the new routine in mmio.c.
>>
>> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
>> ---
>>  Makefile             |   1 -
>>  include/kvm/ioport.h |  20 -----
>>  include/kvm/kvm.h    |   2 -
>>  ioport.c             | 173 -------------------------------------------
>>  mmio.c               |   2 +-
>>  5 files changed, 1 insertion(+), 197 deletions(-)
>>  delete mode 100644 ioport.c
>>
>> diff --git a/Makefile b/Makefile
>> index 35bb1182..94ff5da6 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -56,7 +56,6 @@ OBJS	+= framebuffer.o
>>  OBJS	+= guest_compat.o
>>  OBJS	+= hw/rtc.o
>>  OBJS	+= hw/serial.o
>> -OBJS	+= ioport.o
>>  OBJS	+= irq.o
>>  OBJS	+= kvm-cpu.o
>>  OBJS	+= kvm.o
>> diff --git a/include/kvm/ioport.h b/include/kvm/ioport.h
>> index a61038e2..38636553 100644
>> --- a/include/kvm/ioport.h
>> +++ b/include/kvm/ioport.h
>> @@ -17,28 +17,8 @@
>>  
>>  struct kvm;
> Looks to me like the above forward declaration can be removed; same for all the
> includes except linux/byteorder.h, needed for the lexx_to_cpu/cpu_to_lexx
> functions, and linux/types.h for the uxx typedefs. Otherwise looks good.

Actually, ignore the part about removing the includes, it opens a new can of worms
- byteorder.h doesn't include compiler.h where __always_inline is defined, and
various files where struct kvm_cpu is used don't include kvm-cpu.h (like pci.c,
hw/serial.c, etc). The header removal is not trivial and I think it should be part
of another cleanup patch.

Thanks,

Alex

>
> Thanks,
>
> Alex
>
>>  
>> -struct ioport {
>> -	struct rb_int_node		node;
>> -	struct ioport_operations	*ops;
>> -	void				*priv;
>> -	struct device_header		dev_hdr;
>> -	u32				refcount;
>> -	bool				remove;
>> -};
>> -
>> -struct ioport_operations {
>> -	bool (*io_in)(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size);
>> -	bool (*io_out)(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size);
>> -};
>> -
>>  void ioport__map_irq(u8 *irq);
>>  
>> -int __must_check ioport__register(struct kvm *kvm, u16 port, struct ioport_operations *ops,
>> -				  int count, void *param);
>> -int ioport__unregister(struct kvm *kvm, u16 port);
>> -int ioport__init(struct kvm *kvm);
>> -int ioport__exit(struct kvm *kvm);
>> -
>>  static inline u8 ioport__read8(u8 *data)
>>  {
>>  	return *data;
>> diff --git a/include/kvm/kvm.h b/include/kvm/kvm.h
>> index 14f9d58b..e70f8ef6 100644
>> --- a/include/kvm/kvm.h
>> +++ b/include/kvm/kvm.h
>> @@ -119,8 +119,6 @@ void kvm__irq_line(struct kvm *kvm, int irq, int level);
>>  void kvm__irq_trigger(struct kvm *kvm, int irq);
>>  bool kvm__emulate_io(struct kvm_cpu *vcpu, u16 port, void *data, int direction, int size, u32 count);
>>  bool kvm__emulate_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, u32 len, u8 is_write);
>> -bool kvm__emulate_pio(struct kvm_cpu *vcpu, u16 port, void *data,
>> -		      int direction, int size, u32 count);
>>  int kvm__destroy_mem(struct kvm *kvm, u64 guest_phys, u64 size, void *userspace_addr);
>>  int kvm__register_mem(struct kvm *kvm, u64 guest_phys, u64 size, void *userspace_addr,
>>  		      enum kvm_mem_type type);
>> diff --git a/ioport.c b/ioport.c
>> deleted file mode 100644
>> index 204d8103..00000000
>> --- a/ioport.c
>> +++ /dev/null
>> @@ -1,173 +0,0 @@
>> -#include "kvm/ioport.h"
>> -
>> -#include "kvm/kvm.h"
>> -#include "kvm/util.h"
>> -#include "kvm/rbtree-interval.h"
>> -#include "kvm/mutex.h"
>> -
>> -#include <linux/kvm.h>	/* for KVM_EXIT_* */
>> -#include <linux/types.h>
>> -
>> -#include <stdbool.h>
>> -#include <limits.h>
>> -#include <stdlib.h>
>> -#include <stdio.h>
>> -
>> -#define ioport_node(n) rb_entry(n, struct ioport, node)
>> -
>> -static DEFINE_MUTEX(ioport_lock);
>> -
>> -static struct rb_root		ioport_tree = RB_ROOT;
>> -
>> -static struct ioport *ioport_search(struct rb_root *root, u64 addr)
>> -{
>> -	struct rb_int_node *node;
>> -
>> -	node = rb_int_search_single(root, addr);
>> -	if (node == NULL)
>> -		return NULL;
>> -
>> -	return ioport_node(node);
>> -}
>> -
>> -static int ioport_insert(struct rb_root *root, struct ioport *data)
>> -{
>> -	return rb_int_insert(root, &data->node);
>> -}
>> -
>> -static void ioport_remove(struct rb_root *root, struct ioport *data)
>> -{
>> -	rb_int_erase(root, &data->node);
>> -}
>> -
>> -static struct ioport *ioport_get(struct rb_root *root, u64 addr)
>> -{
>> -	struct ioport *ioport;
>> -
>> -	mutex_lock(&ioport_lock);
>> -	ioport = ioport_search(root, addr);
>> -	if (ioport)
>> -		ioport->refcount++;
>> -	mutex_unlock(&ioport_lock);
>> -
>> -	return ioport;
>> -}
>> -
>> -/* Called with ioport_lock held. */
>> -static void ioport_unregister(struct rb_root *root, struct ioport *data)
>> -{
>> -	ioport_remove(root, data);
>> -	free(data);
>> -}
>> -
>> -static void ioport_put(struct rb_root *root, struct ioport *data)
>> -{
>> -	mutex_lock(&ioport_lock);
>> -	data->refcount--;
>> -	if (data->remove && data->refcount == 0)
>> -		ioport_unregister(root, data);
>> -	mutex_unlock(&ioport_lock);
>> -}
>> -
>> -int ioport__register(struct kvm *kvm, u16 port, struct ioport_operations *ops, int count, void *param)
>> -{
>> -	struct ioport *entry;
>> -	int r;
>> -
>> -	entry = malloc(sizeof(*entry));
>> -	if (entry == NULL)
>> -		return -ENOMEM;
>> -
>> -	*entry = (struct ioport) {
>> -		.node		= RB_INT_INIT(port, port + count),
>> -		.ops		= ops,
>> -		.priv		= param,
>> -		/*
>> -		 * Start from 0 because ioport__unregister() doesn't decrement
>> -		 * the reference count.
>> -		 */
>> -		.refcount	= 0,
>> -		.remove		= false,
>> -	};
>> -
>> -	mutex_lock(&ioport_lock);
>> -	r = ioport_insert(&ioport_tree, entry);
>> -	if (r < 0)
>> -		goto out_free;
>> -	mutex_unlock(&ioport_lock);
>> -
>> -	return port;
>> -
>> -out_free:
>> -	free(entry);
>> -	mutex_unlock(&ioport_lock);
>> -	return r;
>> -}
>> -
>> -int ioport__unregister(struct kvm *kvm, u16 port)
>> -{
>> -	struct ioport *entry;
>> -
>> -	mutex_lock(&ioport_lock);
>> -	entry = ioport_search(&ioport_tree, port);
>> -	if (!entry) {
>> -		mutex_unlock(&ioport_lock);
>> -		return -ENOENT;
>> -	}
>> -	/* The same reasoning from kvm__deregister_mmio() applies. */
>> -	if (entry->refcount == 0)
>> -		ioport_unregister(&ioport_tree, entry);
>> -	else
>> -		entry->remove = true;
>> -	mutex_unlock(&ioport_lock);
>> -
>> -	return 0;
>> -}
>> -
>> -static const char *to_direction(int direction)
>> -{
>> -	if (direction == KVM_EXIT_IO_IN)
>> -		return "IN";
>> -	else
>> -		return "OUT";
>> -}
>> -
>> -static void ioport_error(u16 port, void *data, int direction, int size, u32 count)
>> -{
>> -	fprintf(stderr, "IO error: %s port=%x, size=%d, count=%u\n", to_direction(direction), port, size, count);
>> -}
>> -
>> -bool kvm__emulate_io(struct kvm_cpu *vcpu, u16 port, void *data, int direction, int size, u32 count)
>> -{
>> -	struct ioport_operations *ops;
>> -	bool ret = false;
>> -	struct ioport *entry;
>> -	void *ptr = data;
>> -	struct kvm *kvm = vcpu->kvm;
>> -
>> -	entry = ioport_get(&ioport_tree, port);
>> -	if (!entry)
>> -		return kvm__emulate_pio(vcpu, port, data, direction,
>> -					size, count);
>> -
>> -	ops	= entry->ops;
>> -
>> -	while (count--) {
>> -		if (direction == KVM_EXIT_IO_IN && ops->io_in)
>> -				ret = ops->io_in(entry, vcpu, port, ptr, size);
>> -		else if (direction == KVM_EXIT_IO_OUT && ops->io_out)
>> -				ret = ops->io_out(entry, vcpu, port, ptr, size);
>> -
>> -		ptr += size;
>> -	}
>> -
>> -	ioport_put(&ioport_tree, entry);
>> -
>> -	if (ret)
>> -		return true;
>> -
>> -	if (kvm->cfg.ioport_debug)
>> -		ioport_error(port, data, direction, size, count);
>> -
>> -	return !kvm->cfg.ioport_debug;
>> -}
>> diff --git a/mmio.c b/mmio.c
>> index 4cce1901..5249af39 100644
>> --- a/mmio.c
>> +++ b/mmio.c
>> @@ -206,7 +206,7 @@ out:
>>  	return true;
>>  }
>>  
>> -bool kvm__emulate_pio(struct kvm_cpu *vcpu, u16 port, void *data,
>> +bool kvm__emulate_io(struct kvm_cpu *vcpu, u16 port, void *data,
>>  		     int direction, int size, u32 count)
>>  {
>>  	struct mmio_mapping *mmio;
> _______________________________________________
> kvmarm mailing list
> kvmarm@lists.cs.columbia.edu
> https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

WARNING: multiple messages have this Message-ID (diff)
From: Alexandru Elisei <alexandru.elisei@arm.com>
To: Andre Przywara <andre.przywara@arm.com>,
	Will Deacon <will@kernel.org>,
	Julien Thierry <julien.thierry.kdev@gmail.com>
Cc: Marc Zyngier <maz@kernel.org>,
	kvmarm@lists.cs.columbia.edu,
	linux-arm-kernel@lists.infradead.org, kvm@vger.kernel.org
Subject: Re: [PATCH kvmtool 19/21] Remove ioport specific routines
Date: Wed, 17 Feb 2021 16:11:51 +0000	[thread overview]
Message-ID: <389aa087-b079-cafb-b018-eab599e337ed@arm.com> (raw)
In-Reply-To: <05a0df3a-625f-74de-8014-e78aee9e8427@arm.com>

Hi Andre,

On 2/17/21 3:49 PM, Alexandru Elisei wrote:
> Hi Andre,
>
> On 12/10/20 2:29 PM, Andre Przywara wrote:
>> Now that all users of the dedicated ioport trap handler interface are
>> gone, we can retire the code associated with it.
>>
>> This removes ioport.c and ioport.h, along with removing prototypes from
>> other header files.
>>
>> This also transfers the responsibility for port I/O trap handling
>> entirely into the new routine in mmio.c.
>>
>> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
>> ---
>>  Makefile             |   1 -
>>  include/kvm/ioport.h |  20 -----
>>  include/kvm/kvm.h    |   2 -
>>  ioport.c             | 173 -------------------------------------------
>>  mmio.c               |   2 +-
>>  5 files changed, 1 insertion(+), 197 deletions(-)
>>  delete mode 100644 ioport.c
>>
>> diff --git a/Makefile b/Makefile
>> index 35bb1182..94ff5da6 100644
>> --- a/Makefile
>> +++ b/Makefile
>> @@ -56,7 +56,6 @@ OBJS	+= framebuffer.o
>>  OBJS	+= guest_compat.o
>>  OBJS	+= hw/rtc.o
>>  OBJS	+= hw/serial.o
>> -OBJS	+= ioport.o
>>  OBJS	+= irq.o
>>  OBJS	+= kvm-cpu.o
>>  OBJS	+= kvm.o
>> diff --git a/include/kvm/ioport.h b/include/kvm/ioport.h
>> index a61038e2..38636553 100644
>> --- a/include/kvm/ioport.h
>> +++ b/include/kvm/ioport.h
>> @@ -17,28 +17,8 @@
>>  
>>  struct kvm;
> Looks to me like the above forward declaration can be removed; same for all the
> includes except linux/byteorder.h, needed for the lexx_to_cpu/cpu_to_lexx
> functions, and linux/types.h for the uxx typedefs. Otherwise looks good.

Actually, ignore the part about removing the includes, it opens a new can of worms
- byteorder.h doesn't include compiler.h where __always_inline is defined, and
various files where struct kvm_cpu is used don't include kvm-cpu.h (like pci.c,
hw/serial.c, etc). The header removal is not trivial and I think it should be part
of another cleanup patch.

Thanks,

Alex

>
> Thanks,
>
> Alex
>
>>  
>> -struct ioport {
>> -	struct rb_int_node		node;
>> -	struct ioport_operations	*ops;
>> -	void				*priv;
>> -	struct device_header		dev_hdr;
>> -	u32				refcount;
>> -	bool				remove;
>> -};
>> -
>> -struct ioport_operations {
>> -	bool (*io_in)(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size);
>> -	bool (*io_out)(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size);
>> -};
>> -
>>  void ioport__map_irq(u8 *irq);
>>  
>> -int __must_check ioport__register(struct kvm *kvm, u16 port, struct ioport_operations *ops,
>> -				  int count, void *param);
>> -int ioport__unregister(struct kvm *kvm, u16 port);
>> -int ioport__init(struct kvm *kvm);
>> -int ioport__exit(struct kvm *kvm);
>> -
>>  static inline u8 ioport__read8(u8 *data)
>>  {
>>  	return *data;
>> diff --git a/include/kvm/kvm.h b/include/kvm/kvm.h
>> index 14f9d58b..e70f8ef6 100644
>> --- a/include/kvm/kvm.h
>> +++ b/include/kvm/kvm.h
>> @@ -119,8 +119,6 @@ void kvm__irq_line(struct kvm *kvm, int irq, int level);
>>  void kvm__irq_trigger(struct kvm *kvm, int irq);
>>  bool kvm__emulate_io(struct kvm_cpu *vcpu, u16 port, void *data, int direction, int size, u32 count);
>>  bool kvm__emulate_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, u32 len, u8 is_write);
>> -bool kvm__emulate_pio(struct kvm_cpu *vcpu, u16 port, void *data,
>> -		      int direction, int size, u32 count);
>>  int kvm__destroy_mem(struct kvm *kvm, u64 guest_phys, u64 size, void *userspace_addr);
>>  int kvm__register_mem(struct kvm *kvm, u64 guest_phys, u64 size, void *userspace_addr,
>>  		      enum kvm_mem_type type);
>> diff --git a/ioport.c b/ioport.c
>> deleted file mode 100644
>> index 204d8103..00000000
>> --- a/ioport.c
>> +++ /dev/null
>> @@ -1,173 +0,0 @@
>> -#include "kvm/ioport.h"
>> -
>> -#include "kvm/kvm.h"
>> -#include "kvm/util.h"
>> -#include "kvm/rbtree-interval.h"
>> -#include "kvm/mutex.h"
>> -
>> -#include <linux/kvm.h>	/* for KVM_EXIT_* */
>> -#include <linux/types.h>
>> -
>> -#include <stdbool.h>
>> -#include <limits.h>
>> -#include <stdlib.h>
>> -#include <stdio.h>
>> -
>> -#define ioport_node(n) rb_entry(n, struct ioport, node)
>> -
>> -static DEFINE_MUTEX(ioport_lock);
>> -
>> -static struct rb_root		ioport_tree = RB_ROOT;
>> -
>> -static struct ioport *ioport_search(struct rb_root *root, u64 addr)
>> -{
>> -	struct rb_int_node *node;
>> -
>> -	node = rb_int_search_single(root, addr);
>> -	if (node == NULL)
>> -		return NULL;
>> -
>> -	return ioport_node(node);
>> -}
>> -
>> -static int ioport_insert(struct rb_root *root, struct ioport *data)
>> -{
>> -	return rb_int_insert(root, &data->node);
>> -}
>> -
>> -static void ioport_remove(struct rb_root *root, struct ioport *data)
>> -{
>> -	rb_int_erase(root, &data->node);
>> -}
>> -
>> -static struct ioport *ioport_get(struct rb_root *root, u64 addr)
>> -{
>> -	struct ioport *ioport;
>> -
>> -	mutex_lock(&ioport_lock);
>> -	ioport = ioport_search(root, addr);
>> -	if (ioport)
>> -		ioport->refcount++;
>> -	mutex_unlock(&ioport_lock);
>> -
>> -	return ioport;
>> -}
>> -
>> -/* Called with ioport_lock held. */
>> -static void ioport_unregister(struct rb_root *root, struct ioport *data)
>> -{
>> -	ioport_remove(root, data);
>> -	free(data);
>> -}
>> -
>> -static void ioport_put(struct rb_root *root, struct ioport *data)
>> -{
>> -	mutex_lock(&ioport_lock);
>> -	data->refcount--;
>> -	if (data->remove && data->refcount == 0)
>> -		ioport_unregister(root, data);
>> -	mutex_unlock(&ioport_lock);
>> -}
>> -
>> -int ioport__register(struct kvm *kvm, u16 port, struct ioport_operations *ops, int count, void *param)
>> -{
>> -	struct ioport *entry;
>> -	int r;
>> -
>> -	entry = malloc(sizeof(*entry));
>> -	if (entry == NULL)
>> -		return -ENOMEM;
>> -
>> -	*entry = (struct ioport) {
>> -		.node		= RB_INT_INIT(port, port + count),
>> -		.ops		= ops,
>> -		.priv		= param,
>> -		/*
>> -		 * Start from 0 because ioport__unregister() doesn't decrement
>> -		 * the reference count.
>> -		 */
>> -		.refcount	= 0,
>> -		.remove		= false,
>> -	};
>> -
>> -	mutex_lock(&ioport_lock);
>> -	r = ioport_insert(&ioport_tree, entry);
>> -	if (r < 0)
>> -		goto out_free;
>> -	mutex_unlock(&ioport_lock);
>> -
>> -	return port;
>> -
>> -out_free:
>> -	free(entry);
>> -	mutex_unlock(&ioport_lock);
>> -	return r;
>> -}
>> -
>> -int ioport__unregister(struct kvm *kvm, u16 port)
>> -{
>> -	struct ioport *entry;
>> -
>> -	mutex_lock(&ioport_lock);
>> -	entry = ioport_search(&ioport_tree, port);
>> -	if (!entry) {
>> -		mutex_unlock(&ioport_lock);
>> -		return -ENOENT;
>> -	}
>> -	/* The same reasoning from kvm__deregister_mmio() applies. */
>> -	if (entry->refcount == 0)
>> -		ioport_unregister(&ioport_tree, entry);
>> -	else
>> -		entry->remove = true;
>> -	mutex_unlock(&ioport_lock);
>> -
>> -	return 0;
>> -}
>> -
>> -static const char *to_direction(int direction)
>> -{
>> -	if (direction == KVM_EXIT_IO_IN)
>> -		return "IN";
>> -	else
>> -		return "OUT";
>> -}
>> -
>> -static void ioport_error(u16 port, void *data, int direction, int size, u32 count)
>> -{
>> -	fprintf(stderr, "IO error: %s port=%x, size=%d, count=%u\n", to_direction(direction), port, size, count);
>> -}
>> -
>> -bool kvm__emulate_io(struct kvm_cpu *vcpu, u16 port, void *data, int direction, int size, u32 count)
>> -{
>> -	struct ioport_operations *ops;
>> -	bool ret = false;
>> -	struct ioport *entry;
>> -	void *ptr = data;
>> -	struct kvm *kvm = vcpu->kvm;
>> -
>> -	entry = ioport_get(&ioport_tree, port);
>> -	if (!entry)
>> -		return kvm__emulate_pio(vcpu, port, data, direction,
>> -					size, count);
>> -
>> -	ops	= entry->ops;
>> -
>> -	while (count--) {
>> -		if (direction == KVM_EXIT_IO_IN && ops->io_in)
>> -				ret = ops->io_in(entry, vcpu, port, ptr, size);
>> -		else if (direction == KVM_EXIT_IO_OUT && ops->io_out)
>> -				ret = ops->io_out(entry, vcpu, port, ptr, size);
>> -
>> -		ptr += size;
>> -	}
>> -
>> -	ioport_put(&ioport_tree, entry);
>> -
>> -	if (ret)
>> -		return true;
>> -
>> -	if (kvm->cfg.ioport_debug)
>> -		ioport_error(port, data, direction, size, count);
>> -
>> -	return !kvm->cfg.ioport_debug;
>> -}
>> diff --git a/mmio.c b/mmio.c
>> index 4cce1901..5249af39 100644
>> --- a/mmio.c
>> +++ b/mmio.c
>> @@ -206,7 +206,7 @@ out:
>>  	return true;
>>  }
>>  
>> -bool kvm__emulate_pio(struct kvm_cpu *vcpu, u16 port, void *data,
>> +bool kvm__emulate_io(struct kvm_cpu *vcpu, u16 port, void *data,
>>  		     int direction, int size, u32 count)
>>  {
>>  	struct mmio_mapping *mmio;
> _______________________________________________
> kvmarm mailing list
> kvmarm@lists.cs.columbia.edu
> https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2021-02-17 16:12 UTC|newest]

Thread overview: 216+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-10 14:28 [PATCH kvmtool 00/21] Unify I/O port and MMIO trap handling Andre Przywara
2020-12-10 14:28 ` Andre Przywara
2020-12-10 14:28 ` Andre Przywara
2020-12-10 14:28 ` [PATCH kvmtool 01/21] ioport: Remove ioport__setup_arch() Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-10 17:44   ` Alexandru Elisei
2021-02-10 17:44     ` Alexandru Elisei
2021-02-10 17:44     ` Alexandru Elisei
2021-02-11 17:16     ` Andre Przywara
2021-02-11 17:16       ` Andre Przywara
2021-02-11 17:16       ` Andre Przywara
2021-02-11 17:32       ` Alexandru Elisei
2021-02-11 17:32         ` Alexandru Elisei
2021-02-11 17:32         ` Alexandru Elisei
2021-02-17 16:46         ` Andre Przywara
2021-02-17 16:46           ` Andre Przywara
2021-02-17 16:46           ` Andre Przywara
2021-02-22 10:23           ` Andre Przywara
2021-02-22 10:23             ` Andre Przywara
2021-02-22 10:23             ` Andre Przywara
2021-02-22 15:01             ` Alexandru Elisei
2021-02-22 15:01               ` Alexandru Elisei
2021-02-22 15:01               ` Alexandru Elisei
2020-12-10 14:28 ` [PATCH kvmtool 02/21] hw/serial: Use device abstraction for FDT generator function Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-11 12:05   ` Alexandru Elisei
2021-02-11 12:05     ` Alexandru Elisei
2021-02-11 12:05     ` Alexandru Elisei
2021-02-11 17:45     ` Andre Przywara
2021-02-11 17:45       ` Andre Przywara
2021-02-11 17:45       ` Andre Przywara
2020-12-10 14:28 ` [PATCH kvmtool 03/21] ioport: Retire .generate_fdt_node functionality Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-11 14:05   ` Alexandru Elisei
2021-02-11 14:05     ` Alexandru Elisei
2021-02-11 14:05     ` Alexandru Elisei
2021-02-17 15:54     ` Andre Przywara
2021-02-17 15:54       ` Andre Przywara
2021-02-17 15:54       ` Andre Przywara
2021-02-17 16:06       ` Alexandru Elisei
2021-02-17 16:06         ` Alexandru Elisei
2021-02-17 16:06         ` Alexandru Elisei
2020-12-10 14:28 ` [PATCH kvmtool 04/21] mmio: Extend handling to include ioport emulation Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-11 16:10   ` Alexandru Elisei
2021-02-11 16:10     ` Alexandru Elisei
2021-02-11 16:10     ` Alexandru Elisei
2021-02-17 17:43     ` Andre Przywara
2021-02-17 17:43       ` Andre Przywara
2021-02-17 17:43       ` Andre Przywara
2021-02-22 15:50       ` Alexandru Elisei
2021-02-22 15:50         ` Alexandru Elisei
2021-02-22 15:50         ` Alexandru Elisei
2020-12-10 14:28 ` [PATCH kvmtool 05/21] hw/i8042: Clean up data types Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-11 16:55   ` Alexandru Elisei
2021-02-11 16:55     ` Alexandru Elisei
2021-02-11 16:55     ` Alexandru Elisei
2021-02-17 17:46     ` Andre Przywara
2021-02-17 17:46       ` Andre Przywara
2021-02-17 17:46       ` Andre Przywara
2020-12-10 14:28 ` [PATCH kvmtool 06/21] hw/i8042: Refactor trap handler Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-11 17:23   ` Alexandru Elisei
2021-02-11 17:23     ` Alexandru Elisei
2021-02-11 17:23     ` Alexandru Elisei
2021-02-18 10:34     ` Andre Przywara
2021-02-18 10:34       ` Andre Przywara
2021-02-18 10:34       ` Andre Przywara
2021-02-18 11:17       ` Alexandru Elisei
2021-02-18 11:17         ` Alexandru Elisei
2021-02-18 11:17         ` Alexandru Elisei
2021-02-18 11:48         ` Andre Przywara
2021-02-18 11:48           ` Andre Przywara
2021-02-18 11:48           ` Andre Przywara
2021-02-22 16:03           ` Alexandru Elisei
2021-02-22 16:03             ` Alexandru Elisei
2021-02-22 16:03             ` Alexandru Elisei
2020-12-10 14:28 ` [PATCH kvmtool 07/21] hw/i8042: Switch to new trap handlers Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-12 10:41   ` Alexandru Elisei
2021-02-12 10:41     ` Alexandru Elisei
2021-02-12 10:41     ` Alexandru Elisei
2021-02-18 12:09     ` Andre Przywara
2021-02-18 12:09       ` Andre Przywara
2021-02-18 12:09       ` Andre Przywara
2021-02-22 16:19       ` Alexandru Elisei
2021-02-22 16:19         ` Alexandru Elisei
2021-02-22 16:19         ` Alexandru Elisei
2020-12-10 14:28 ` [PATCH kvmtool 08/21] x86/ioport: Refactor " Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-12 11:14   ` Alexandru Elisei
2021-02-12 11:14     ` Alexandru Elisei
2021-02-12 11:14     ` Alexandru Elisei
2020-12-10 14:28 ` [PATCH kvmtool 09/21] x86/ioport: Switch to new " Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-12 11:27   ` Alexandru Elisei
2021-02-12 11:27     ` Alexandru Elisei
2021-02-12 11:27     ` Alexandru Elisei
2021-02-18 14:05     ` Andre Przywara
2021-02-18 14:05       ` Andre Przywara
2021-02-18 14:05       ` Andre Przywara
2020-12-10 14:28 ` [PATCH kvmtool 10/21] hw/rtc: Refactor " Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-12 11:56   ` Alexandru Elisei
2021-02-12 11:56     ` Alexandru Elisei
2021-02-12 11:56     ` Alexandru Elisei
2020-12-10 14:28 ` [PATCH kvmtool 11/21] hw/rtc: Switch to new trap handler Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-12 12:02   ` Alexandru Elisei
2021-02-12 12:02     ` Alexandru Elisei
2021-02-12 12:02     ` Alexandru Elisei
2020-12-10 14:28 ` [PATCH kvmtool 12/21] hw/vesa: Switch trap handling to use MMIO handler Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2020-12-10 14:28   ` Andre Przywara
2021-02-12 17:50   ` Alexandru Elisei
2021-02-12 17:50     ` Alexandru Elisei
2021-02-12 17:50     ` Alexandru Elisei
2020-12-10 14:29 ` [PATCH kvmtool 13/21] hw/serial: Refactor trap handler Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2021-02-16 14:22   ` Alexandru Elisei
2021-02-16 14:22     ` Alexandru Elisei
2021-02-16 14:22     ` Alexandru Elisei
2021-02-18 14:41     ` Andre Przywara
2021-02-18 14:41       ` Andre Przywara
2021-02-18 14:41       ` Andre Przywara
2021-02-22 17:40       ` Alexandru Elisei
2021-02-22 17:40         ` Alexandru Elisei
2021-02-22 17:40         ` Alexandru Elisei
2021-02-24 14:54         ` Andre Przywara
2021-02-24 14:54           ` Andre Przywara
2021-02-24 14:54           ` Andre Przywara
2020-12-10 14:29 ` [PATCH kvmtool 14/21] hw/serial: Switch to new trap handlers Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2021-02-16 14:31   ` Alexandru Elisei
2021-02-16 14:31     ` Alexandru Elisei
2021-02-16 14:31     ` Alexandru Elisei
2020-12-10 14:29 ` [PATCH kvmtool 15/21] vfio: Refactor ioport trap handler Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2021-02-16 14:47   ` Alexandru Elisei
2021-02-16 14:47     ` Alexandru Elisei
2021-02-16 14:47     ` Alexandru Elisei
2021-02-18 15:51     ` Andre Przywara
2021-02-18 15:51       ` Andre Przywara
2021-02-18 15:51       ` Andre Przywara
2020-12-10 14:29 ` [PATCH kvmtool 16/21] vfio: Switch to new ioport trap handlers Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2021-02-16 14:52   ` Alexandru Elisei
2021-02-16 14:52     ` Alexandru Elisei
2021-02-16 14:52     ` Alexandru Elisei
2020-12-10 14:29 ` [PATCH kvmtool 17/21] virtio: Switch trap handling to use MMIO handler Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2021-02-16 17:03   ` Alexandru Elisei
2021-02-16 17:03     ` Alexandru Elisei
2021-02-16 17:03     ` Alexandru Elisei
2021-02-18 16:13     ` Andre Przywara
2021-02-18 16:13       ` Andre Przywara
2021-02-18 16:13       ` Andre Przywara
2020-12-10 14:29 ` [PATCH kvmtool 18/21] pci: " Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2021-02-17 15:14   ` Alexandru Elisei
2021-02-17 15:14     ` Alexandru Elisei
2021-02-17 15:14     ` Alexandru Elisei
2020-12-10 14:29 ` [PATCH kvmtool 19/21] Remove ioport specific routines Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2021-02-17 15:49   ` Alexandru Elisei
2021-02-17 15:49     ` Alexandru Elisei
2021-02-17 15:49     ` Alexandru Elisei
2021-02-17 16:11     ` Alexandru Elisei [this message]
2021-02-17 16:11       ` Alexandru Elisei
2021-02-17 16:11       ` Alexandru Elisei
2021-02-18 16:34       ` Andre Przywara
2021-02-18 16:34         ` Andre Przywara
2021-02-18 16:34         ` Andre Przywara
2020-12-10 14:29 ` [PATCH kvmtool 20/21] hw/serial: ARM/arm64: Use MMIO at higher addresses Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2021-02-17 16:48   ` Alexandru Elisei
2021-02-17 16:48     ` Alexandru Elisei
2021-02-17 16:48     ` Alexandru Elisei
2021-02-18 12:18     ` Alexandru Elisei
2021-02-18 12:18       ` Alexandru Elisei
2021-02-18 12:18       ` Alexandru Elisei
2021-02-18 16:38       ` Andre Przywara
2021-02-18 16:38         ` Andre Przywara
2021-02-18 16:38         ` Andre Przywara
2020-12-10 14:29 ` [PATCH kvmtool 21/21] hw/rtc: " Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2020-12-10 14:29   ` Andre Przywara
2021-02-18 13:33   ` Alexandru Elisei
2021-02-18 13:33     ` Alexandru Elisei
2021-02-18 13:33     ` Alexandru Elisei
2021-02-18 16:41     ` Andre Przywara
2021-02-18 16:41       ` Andre Przywara
2021-02-18 16:41       ` Andre Przywara
2021-02-10 17:44 ` [PATCH kvmtool 00/21] Unify I/O port and MMIO trap handling Alexandru Elisei
2021-02-10 17:44   ` Alexandru Elisei
2021-02-10 17:44   ` Alexandru Elisei

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=389aa087-b079-cafb-b018-eab599e337ed@arm.com \
    --to=alexandru.elisei@arm.com \
    --cc=andre.przywara@arm.com \
    --cc=julien.thierry.kdev@gmail.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=maz@kernel.org \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.