From patchwork Tue Mar 5 08:13:08 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Cornelia Huck X-Patchwork-Id: 224957 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 9182B2C034A for ; Tue, 5 Mar 2013 19:19:07 +1100 (EST) Received: from localhost ([::1]:54880 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UCn5V-0001tb-I0 for incoming@patchwork.ozlabs.org; Tue, 05 Mar 2013 03:19:05 -0500 Received: from eggs.gnu.org ([208.118.235.92]:41933) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UCn5A-0001sz-OM for qemu-devel@nongnu.org; Tue, 05 Mar 2013 03:18:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UCn55-0000Ph-4r for qemu-devel@nongnu.org; Tue, 05 Mar 2013 03:18:44 -0500 Received: from e06smtp17.uk.ibm.com ([195.75.94.113]:52957) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UCmzs-0006F5-P3 for qemu-devel@nongnu.org; Tue, 05 Mar 2013 03:13:17 -0500 Received: from /spool/local by e06smtp17.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 5 Mar 2013 08:11:25 -0000 Received: from d06dlp02.portsmouth.uk.ibm.com (9.149.20.14) by e06smtp17.uk.ibm.com (192.168.101.147) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 5 Mar 2013 08:11:24 -0000 Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by d06dlp02.portsmouth.uk.ibm.com (Postfix) with ESMTP id C4D83219005B for ; Tue, 5 Mar 2013 08:14:36 +0000 (GMT) Received: from d06av06.portsmouth.uk.ibm.com (d06av06.portsmouth.uk.ibm.com [9.149.37.217]) by b06cxnps3075.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r258D1L632571624 for ; Tue, 5 Mar 2013 08:13:01 GMT Received: from d06av06.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av06.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r258DA4O023229 for ; Tue, 5 Mar 2013 01:13:10 -0700 Received: from gondolin (dyn-9-152-224-122.boeblingen.de.ibm.com [9.152.224.122]) by d06av06.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id r258D97g023201; Tue, 5 Mar 2013 01:13:10 -0700 Date: Tue, 5 Mar 2013 09:13:08 +0100 From: Cornelia Huck To: Marcelo Tosatti Message-ID: <20130305091308.1a1173d1@gondolin> In-Reply-To: <20130305000741.GA17903@amt.cnet> References: <1362051201-56541-1-git-send-email-cornelia.huck@de.ibm.com> <1362051201-56541-7-git-send-email-cornelia.huck@de.ibm.com> <20130305000741.GA17903@amt.cnet> Organization: IBM Deutschland Research & Development GmbH Vorsitzende des Aufsichtsrats: Martina Koederitz =?UTF-8?B?R2VzY2jDpGZ0c2bDvGhydW5nOg==?= Dirk Wittkopp Sitz der Gesellschaft: =?UTF-8?B?QsO2Ymxpbmdlbg==?= Registergericht: Amtsgericht Stuttgart, HRB 243294 Mime-Version: 1.0 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13030508-0542-0000-0000-00000491CDB2 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x-2.6.x [generic] X-Received-From: 195.75.94.113 Cc: Carsten Otte , KVM , Gleb Natapov , "Michael S. Tsirkin" , linux-s390 , Heiko Carstens , Alexander Graf , qemu-devel , Christian Borntraeger , Martin Schwidefsky Subject: Re: [Qemu-devel] [PATCH v5 6/6] KVM: s390: Wire up ioeventfd. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org On Mon, 4 Mar 2013 21:07:41 -0300 Marcelo Tosatti wrote: > On Thu, Feb 28, 2013 at 12:33:21PM +0100, Cornelia Huck wrote: > > Enable ioeventfd support on s390 and hook up diagnose 500 virtio-ccw > > notifications. > > > > Signed-off-by: Cornelia Huck > > --- > > arch/s390/kvm/Kconfig | 1 + > > arch/s390/kvm/Makefile | 2 +- > > arch/s390/kvm/diag.c | 26 ++++++++++++++++++++++++++ > > arch/s390/kvm/kvm-s390.c | 1 + > > 4 files changed, 29 insertions(+), 1 deletion(-) > > > > diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig > > index b58dd86..3c43e30 100644 > > --- a/arch/s390/kvm/Kconfig > > +++ b/arch/s390/kvm/Kconfig > > @@ -22,6 +22,7 @@ config KVM > > select PREEMPT_NOTIFIERS > > select ANON_INODES > > select HAVE_KVM_CPU_RELAX_INTERCEPT > > + select HAVE_KVM_EVENTFD > > ---help--- > > Support hosting paravirtualized guest machines using the SIE > > virtualization capability on the mainframe. This should work > > diff --git a/arch/s390/kvm/Makefile b/arch/s390/kvm/Makefile > > index 3975722..8fe9d65 100644 > > --- a/arch/s390/kvm/Makefile > > +++ b/arch/s390/kvm/Makefile > > @@ -6,7 +6,7 @@ > > # it under the terms of the GNU General Public License (version 2 only) > > # as published by the Free Software Foundation. > > > > -common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o) > > +common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o eventfd.o) > > > > ccflags-y := -Ivirt/kvm -Iarch/s390/kvm > > > > diff --git a/arch/s390/kvm/diag.c b/arch/s390/kvm/diag.c > > index a390687..1c01a99 100644 > > --- a/arch/s390/kvm/diag.c > > +++ b/arch/s390/kvm/diag.c > > @@ -13,6 +13,7 @@ > > > > #include > > #include > > +#include > > #include "kvm-s390.h" > > #include "trace.h" > > #include "trace-s390.h" > > @@ -104,6 +105,29 @@ static int __diag_ipl_functions(struct kvm_vcpu *vcpu) > > return -EREMOTE; > > } > > > > +static int __diag_virtio_hypercall(struct kvm_vcpu *vcpu) > > +{ > > + int ret, idx; > > + > > + /* No virtio-ccw notification? Get out quickly. */ > > + if (!vcpu->kvm->arch.css_support || > > + (vcpu->run->s.regs.gprs[1] != KVM_S390_VIRTIO_CCW_NOTIFY)) > > + return -EOPNOTSUPP; > > + > > + idx = srcu_read_lock(&vcpu->kvm->srcu); > > + /* > > + * The layout is as follows: > > + * - gpr 2 contains the subchannel id (passed as addr) > > + * - gpr 3 contains the virtqueue index (passed as datamatch) > > + */ > > + ret = kvm_io_bus_write(vcpu->kvm, KVM_VIRTIO_CCW_NOTIFY_BUS, > > + vcpu->run->s.regs.gprs[2], > > + 8, &vcpu->run->s.regs.gprs[3]); > > + srcu_read_unlock(&vcpu->kvm->srcu, idx); > > + /* kvm_io_bus_write returns -EOPNOTSUPP if it found no match. */ > > + return ret < 0 ? ret : 0; > > +} > > + > > What about the cookie? This is the not-performance-optimized version which went through our testing and which I'd like to see applied. I also have a not-yet-tested patch that adds cookie support (see below), but I'd like to postpone this to 3.10. commit 8fce4a8a3478252f7ee2eb74d2732673f5911120 Author: Cornelia Huck Date: Tue Feb 26 17:05:01 2013 +0100 virtio-ccw: ioeventfd: use cookies Signed-off-by: Cornelia Huck diff --git a/arch/s390/kvm/diag.c b/arch/s390/kvm/diag.c index 1c01a99..bd2a013 100644 --- a/arch/s390/kvm/diag.c +++ b/arch/s390/kvm/diag.c @@ -108,22 +108,29 @@ static int __diag_ipl_functions(struct kvm_vcpu *vcpu) static int __diag_virtio_hypercall(struct kvm_vcpu *vcpu) { int ret, idx; + long cookie; /* No virtio-ccw notification? Get out quickly. */ if (!vcpu->kvm->arch.css_support || (vcpu->run->s.regs.gprs[1] != KVM_S390_VIRTIO_CCW_NOTIFY)) return -EOPNOTSUPP; + cookie = vcpu->run->s.regs.gprs[4]; idx = srcu_read_lock(&vcpu->kvm->srcu); /* * The layout is as follows: * - gpr 2 contains the subchannel id (passed as addr) * - gpr 3 contains the virtqueue index (passed as datamatch) + * - gpr 4 contains the index on the bus (optionally) */ - ret = kvm_io_bus_write(vcpu->kvm, KVM_VIRTIO_CCW_NOTIFY_BUS, - vcpu->run->s.regs.gprs[2], - 8, &vcpu->run->s.regs.gprs[3]); + ret = kvm_io_bus_write_cookie(vcpu->kvm, KVM_VIRTIO_CCW_NOTIFY_BUS, + vcpu->run->s.regs.gprs[2], + 8, &vcpu->run->s.regs.gprs[3], + &cookie); srcu_read_unlock(&vcpu->kvm->srcu, idx); + if (!ret) + /* Return cookie in gpr 2. */ + vcpu->run->s.regs.gprs[2] = cookie; /* kvm_io_bus_write returns -EOPNOTSUPP if it found no match. */ return ret < 0 ? ret : 0; } diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 206247f..2f65a3a 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -154,6 +154,8 @@ enum kvm_bus { int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, const void *val); +int kvm_io_bus_write_cookie(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, + int len, const void *val, long *cookie); int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, void *val); int kvm_io_bus_register_dev(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 7c188a3..b77ea5f 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2710,6 +2710,51 @@ int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, return -EOPNOTSUPP; } +/* kvm_io_bus_write_cookie - called under kvm->slots_lock */ +int kvm_io_bus_write_cookie(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, + int len, const void *val, long *cookie) +{ + int idx, ret = -EOPNOTSUPP; + struct kvm_io_bus *bus; + struct kvm_io_range range; + + range = (struct kvm_io_range) { + .addr = addr, + .len = len, + }; + + if (!cookie) + return -EINVAL; + + bus = srcu_dereference(kvm->buses[bus_idx], &kvm->srcu); + + /* First try the device referenced by *cookie. */ + if (kvm_io_bus_sort_cmp(&range, &bus->range[*cookie]) == 0) + if (!kvm_iodevice_write(bus->range[*cookie].dev, addr, len, + val)) + return 0; + + /* + * *cookie contained garbage; fall back to search and return the + * correct value in *cookie. + */ + idx = kvm_io_bus_get_first_dev(bus, addr, len); + if (idx < 0) + goto out; + + while (idx < bus->dev_count && + kvm_io_bus_sort_cmp(&range, &bus->range[idx]) == 0) { + if (!kvm_iodevice_write(bus->range[idx].dev, addr, len, val)) { + ret = 0; + goto out; + } + idx++; + } +out: + *cookie = idx; + return ret; +} + /* kvm_io_bus_read - called under kvm->slots_lock */ int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, void *val)