From patchwork Fri Jul 24 14:37:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hildenbrand X-Patchwork-Id: 277467 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D815BC433E4 for ; Fri, 24 Jul 2020 14:40:12 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A1B2520674 for ; Fri, 24 Jul 2020 14:40:12 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="KcNU0UDu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A1B2520674 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:60810 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jyyrr-0005FK-QL for qemu-devel@archiver.kernel.org; Fri, 24 Jul 2020 10:40:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50806) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jyyr0-0003wA-O6 for qemu-devel@nongnu.org; Fri, 24 Jul 2020 10:39:18 -0400 Received: from us-smtp-2.mimecast.com ([207.211.31.81]:21247 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jyyqz-0005hg-00 for qemu-devel@nongnu.org; Fri, 24 Jul 2020 10:39:18 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1595601556; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QbaWCnTfIwlnQBcnbAusk7KmwDgK8uxiYY+Ojl1UPqI=; b=KcNU0UDuJDXWda8JuNzdKtEW5oBxjs1tobVAOGa/Z9Bzj1V4tlXh4nFaW3BypcEdC9LVRq QJWSrdL2hdt7x0g/yDR8VYB7Z2aSV1LF+F6EyBhISpvYE9XyvYRfppxeLBqCfR4tQuwRA7 LbsPAaoPYVtxGmXc2pIO/aPoZh0Y71A= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-140-Ufmx3nrVNC--qoLDgK02Nw-1; Fri, 24 Jul 2020 10:38:03 -0400 X-MC-Unique: Ufmx3nrVNC--qoLDgK02Nw-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E98F880046A; Fri, 24 Jul 2020 14:38:01 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-94.ams2.redhat.com [10.36.113.94]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9E7F1726A4; Fri, 24 Jul 2020 14:37:59 +0000 (UTC) From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH RFCv3 1/9] s390x: move setting of maximum ram size to machine init Date: Fri, 24 Jul 2020 16:37:42 +0200 Message-Id: <20200724143750.59836-2-david@redhat.com> In-Reply-To: <20200724143750.59836-1-david@redhat.com> References: <20200724143750.59836-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=207.211.31.81; envelope-from=david@redhat.com; helo=us-smtp-delivery-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/24 00:00:27 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Huth , Janosch Frank , "Michael S . Tsirkin" , Heiko Carstens , Cornelia Huck , David Hildenbrand , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda , Richard Henderson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" As we no longer fixup the maximum ram size in sclp code, let's move setting the maximum ram size to ccw_init()->s390_memory_init(), which now looks like a better fit. Signed-off-by: David Hildenbrand --- hw/s390x/s390-virtio-ccw.c | 19 ++++++++++++++++--- hw/s390x/sclp.c | 15 +-------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index 8cc2f25d8a..dca8e43001 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -158,13 +158,26 @@ static void virtio_ccw_register_hcalls(void) virtio_ccw_hcall_early_printk); } -static void s390_memory_init(MemoryRegion *ram) +static void s390_memory_init(MachineState *machine) { MemoryRegion *sysmem = get_system_memory(); Error *local_err = NULL; + uint64_t hw_limit; + int ret; + + /* We have to set the memory limit before adding any regions to sysmem. */ + ret = s390_set_memory_limit(machine->maxram_size, &hw_limit); + if (ret == -E2BIG) { + error_report("host supports a maximum of %" PRIu64 " GB", + hw_limit / GiB); + exit(EXIT_FAILURE); + } else if (ret) { + error_report("setting the guest size failed"); + exit(EXIT_FAILURE); + } /* allocate RAM for core */ - memory_region_add_subregion(sysmem, 0, ram); + memory_region_add_subregion(sysmem, 0, machine->ram); /* * Configure the maximum page size. As no memory devices were created @@ -247,7 +260,7 @@ static void ccw_init(MachineState *machine) s390_sclp_init(); /* init memory + setup max page size. Required for the CPU model */ - s390_memory_init(machine->ram); + s390_memory_init(machine); /* init CPUs (incl. CPU model) early so s390_has_feature() works */ s390_init_cpus(machine); diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c index a0ce444b4b..f59195e15a 100644 --- a/hw/s390x/sclp.c +++ b/hw/s390x/sclp.c @@ -327,27 +327,14 @@ void s390_sclp_init(void) static void sclp_realize(DeviceState *dev, Error **errp) { - MachineState *machine = MACHINE(qdev_get_machine()); SCLPDevice *sclp = SCLP(dev); - uint64_t hw_limit; - int ret; /* * qdev_device_add searches the sysbus for TYPE_SCLP_EVENTS_BUS. As long * as we can't find a fitting bus via the qom tree, we have to add the * event facility to the sysbus, so e.g. a sclp console can be created. */ - if (!sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), errp)) { - return; - } - - ret = s390_set_memory_limit(machine->maxram_size, &hw_limit); - if (ret == -E2BIG) { - error_setg(errp, "host supports a maximum of %" PRIu64 " GB", - hw_limit / GiB); - } else if (ret) { - error_setg(errp, "setting the guest size failed"); - } + sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), errp); } static void sclp_memory_init(SCLPDevice *sclp) From patchwork Fri Jul 24 14:37:45 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hildenbrand X-Patchwork-Id: 277465 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C87C7C433E0 for ; Fri, 24 Jul 2020 14:42:20 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 934AE2065F for ; Fri, 24 Jul 2020 14:42:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="VWK4FnS/" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 934AE2065F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:41062 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jyytv-0000MH-SN for qemu-devel@archiver.kernel.org; Fri, 24 Jul 2020 10:42:19 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50894) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jyyr9-0004DM-Nx for qemu-devel@nongnu.org; Fri, 24 Jul 2020 10:39:27 -0400 Received: from us-smtp-2.mimecast.com ([207.211.31.81]:28717 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jyyr7-0005jA-QT for qemu-devel@nongnu.org; Fri, 24 Jul 2020 10:39:27 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1595601565; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8nRggL5zxzjIAsO7gyoMqTDoUEqTrKmVpKuZXCETtsg=; b=VWK4FnS/WxqcVt2yjSdNqqDjFrRHxHa80eSsVno8vi1kqxUOR1u4hOTnVO8MGAkxteiwmN H0AVRqZAceBSDxlJuRsN2dnyH1ijaWIH0U14swiE6qfDetwSyNzVLi+SqnyH7uCa3TOvvm AXl241NwS8RtBRHVlqTk1KVk0wLdrhM= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-473-k-R5_GGuNtWpX1DMAVIBxQ-1; Fri, 24 Jul 2020 10:38:12 -0400 X-MC-Unique: k-R5_GGuNtWpX1DMAVIBxQ-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B57E1C7468; Fri, 24 Jul 2020 14:38:10 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-94.ams2.redhat.com [10.36.113.94]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6D71C710AC; Fri, 24 Jul 2020 14:38:07 +0000 (UTC) From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH RFCv3 4/9] s390x: prepare for more diag500 hypercalls Date: Fri, 24 Jul 2020 16:37:45 +0200 Message-Id: <20200724143750.59836-5-david@redhat.com> In-Reply-To: <20200724143750.59836-1-david@redhat.com> References: <20200724143750.59836-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=207.211.31.81; envelope-from=david@redhat.com; helo=us-smtp-delivery-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/24 00:00:27 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Huth , Janosch Frank , "Michael S . Tsirkin" , Heiko Carstens , Cornelia Huck , David Hildenbrand , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda , Richard Henderson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Let's generalize, abstacting the virtio bits. diag500 is now a generic hypercall to handle QEMU/KVM specific things. Explicitly specify all already defined subcodes, including legacy ones (so we know what we can use for new hypercalls). While at it, move exception handling into the handler. We'll rename the files separately, so git properly detects the rename. Signed-off-by: David Hildenbrand --- hw/s390x/s390-virtio-hcall.c | 14 +++++++------- hw/s390x/s390-virtio-hcall.h | 12 ++++++------ target/s390x/kvm.c | 15 +++------------ target/s390x/misc_helper.c | 3 ++- 4 files changed, 18 insertions(+), 26 deletions(-) diff --git a/hw/s390x/s390-virtio-hcall.c b/hw/s390x/s390-virtio-hcall.c index 5e14bd49b7..7c4ca5d3b2 100644 --- a/hw/s390x/s390-virtio-hcall.c +++ b/hw/s390x/s390-virtio-hcall.c @@ -1,5 +1,5 @@ /* - * Support for virtio hypercalls on s390 + * Support for QEMU/KVM-specific hypercalls on s390 * * Copyright 2012 IBM Corp. * Author(s): Cornelia Huck @@ -44,18 +44,18 @@ static int handle_virtio_ccw_notify(uint64_t subch_id, uint64_t queue) return 0; } -int s390_virtio_hypercall(CPUS390XState *env) +void handle_diag_500(CPUS390XState *env, uintptr_t ra) { const uint64_t subcode = env->regs[1]; switch (subcode) { - case KVM_S390_VIRTIO_NOTIFY: + case DIAG500_VIRTIO_NOTIFY: env->regs[2] = handle_virtio_notify(env->regs[2]); - return 0; - case KVM_S390_VIRTIO_CCW_NOTIFY: + break; + case DIAG500_VIRTIO_CCW_NOTIFY: env->regs[2] = handle_virtio_ccw_notify(env->regs[2], env->regs[3]); - return 0; + break; default: - return -EINVAL; + s390_program_interrupt(env, PGM_SPECIFICATION, ra); } } diff --git a/hw/s390x/s390-virtio-hcall.h b/hw/s390x/s390-virtio-hcall.h index 67e11ea39a..2214216ce8 100644 --- a/hw/s390x/s390-virtio-hcall.h +++ b/hw/s390x/s390-virtio-hcall.h @@ -1,5 +1,5 @@ /* - * Support for virtio hypercalls on s390x + * Support for QEMU/KVM-specific hypercalls on s390 * * Copyright IBM Corp. 2012, 2017 * Author(s): Cornelia Huck @@ -12,10 +12,10 @@ #ifndef HW_S390_VIRTIO_HCALL_H #define HW_S390_VIRTIO_HCALL_H -#include "standard-headers/asm-s390/virtio-ccw.h" +#define DIAG500_VIRTIO_NOTIFY 0 /* legacy, implemented as a NOP */ +#define DIAG500_VIRTIO_RESET 1 /* legacy */ +#define DIAG500_VIRTIO_SET_STATUS 2 /* legacy */ +#define DIAG500_VIRTIO_CCW_NOTIFY 3 /* KVM_S390_VIRTIO_CCW_NOTIFY */ -/* The only thing that we need from the old kvm_virtio.h file */ -#define KVM_S390_VIRTIO_NOTIFY 0 - -int s390_virtio_hypercall(CPUS390XState *env); +void handle_diag_500(CPUS390XState *env, uintptr_t ra); #endif /* HW_S390_VIRTIO_HCALL_H */ diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index f2f75d2a57..dc00750387 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -1551,18 +1551,9 @@ static int handle_e3(S390CPU *cpu, struct kvm_run *run, uint8_t ipbl) return r; } -static int handle_hypercall(S390CPU *cpu, struct kvm_run *run) +static void handle_hypercall(S390CPU *cpu, struct kvm_run *run) { - CPUS390XState *env = &cpu->env; - int ret; - - ret = s390_virtio_hypercall(env); - if (ret == -EINVAL) { - kvm_s390_program_interrupt(cpu, PGM_SPECIFICATION); - return 0; - } - - return ret; + handle_diag_500(&cpu->env, RA_IGNORED); } static void kvm_handle_diag_288(S390CPU *cpu, struct kvm_run *run) @@ -1621,7 +1612,7 @@ static int handle_diag(S390CPU *cpu, struct kvm_run *run, uint32_t ipb) kvm_handle_diag_308(cpu, run); break; case DIAG_KVM_HYPERCALL: - r = handle_hypercall(cpu, run); + handle_hypercall(cpu, run); break; case DIAG_KVM_BREAKPOINT: r = handle_sw_breakpoint(cpu, run); diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c index 58dbc023eb..cfcbfbe50c 100644 --- a/target/s390x/misc_helper.c +++ b/target/s390x/misc_helper.c @@ -119,8 +119,9 @@ void HELPER(diag)(CPUS390XState *env, uint32_t r1, uint32_t r3, uint32_t num) case 0x500: /* KVM hypercall */ qemu_mutex_lock_iothread(); - r = s390_virtio_hypercall(env); + handle_diag_500(env, GETPC()); qemu_mutex_unlock_iothread(); + r = 0; break; case 0x44: /* yield */ From patchwork Fri Jul 24 14:37:49 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hildenbrand X-Patchwork-Id: 277466 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BB6ACC433E4 for ; Fri, 24 Jul 2020 14:41:34 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 884432065F for ; Fri, 24 Jul 2020 14:41:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="cZ9+pzgr" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 884432065F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:37440 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jyytB-0007Iz-La for qemu-devel@archiver.kernel.org; Fri, 24 Jul 2020 10:41:33 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51156) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jyyrl-0005Wn-PT for qemu-devel@nongnu.org; Fri, 24 Jul 2020 10:40:05 -0400 Received: from us-smtp-2.mimecast.com ([207.211.31.81]:24803 helo=us-smtp-delivery-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jyyri-0005mp-Bz for qemu-devel@nongnu.org; Fri, 24 Jul 2020 10:40:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1595601601; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4hu+Vsr13CWYOJ8jNwgQZ6Ll5tqppdT69qgnw+1BdTc=; b=cZ9+pzgrPiOCTqSi/yki/es+/bVshxNC+bkfO1pGGaOmeVr4RpZtcrHLfsgEME9aOyZcJA cQHNAKuEtWETCJZiRYvdghqv3JnKjb/rtf5gt1xe2hfLgg+rdhGe7AwVw2M4/l1y3MKCdq EOg3CMG5nGU44JOx7KZZjBtHfBAc5HU= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-63-fconsG5YNeWXPNbSXM59yA-1; Fri, 24 Jul 2020 10:38:28 -0400 X-MC-Unique: fconsG5YNeWXPNbSXM59yA-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id AD0CB800597; Fri, 24 Jul 2020 14:38:26 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-94.ams2.redhat.com [10.36.113.94]) by smtp.corp.redhat.com (Postfix) with ESMTP id C0FD6710AC; Fri, 24 Jul 2020 14:38:23 +0000 (UTC) From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH RFCv3 8/9] s390x: implement virtio-mem-ccw Date: Fri, 24 Jul 2020 16:37:49 +0200 Message-Id: <20200724143750.59836-9-david@redhat.com> In-Reply-To: <20200724143750.59836-1-david@redhat.com> References: <20200724143750.59836-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=david@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=207.211.31.81; envelope-from=david@redhat.com; helo=us-smtp-delivery-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/24 00:00:27 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Huth , Janosch Frank , "Michael S . Tsirkin" , Heiko Carstens , Cornelia Huck , David Hildenbrand , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda , Richard Henderson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Add a proper CCW proxy device, similar to the PCI variant. Signed-off-by: David Hildenbrand --- hw/s390x/virtio-ccw-mem.c | 167 ++++++++++++++++++++++++++++++++++++++ hw/s390x/virtio-ccw.h | 13 +++ 2 files changed, 180 insertions(+) create mode 100644 hw/s390x/virtio-ccw-mem.c diff --git a/hw/s390x/virtio-ccw-mem.c b/hw/s390x/virtio-ccw-mem.c new file mode 100644 index 0000000000..c38dafd7f0 --- /dev/null +++ b/hw/s390x/virtio-ccw-mem.c @@ -0,0 +1,167 @@ +/* + * Virtio MEM CCW device + * + * Copyright (C) 2020 Red Hat, Inc. + * + * Authors: + * David Hildenbrand + * + * This work is licensed under the terms of the GNU GPL, version 2. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "hw/qdev-properties.h" +#include "hw/virtio/virtio.h" +#include "qapi/error.h" +#include "qemu/module.h" +#include "virtio-ccw.h" +#include "hw/mem/memory-device.h" +#include "qapi/qapi-events-misc.h" + +static void virtio_ccw_mem_realize(VirtioCcwDevice *ccw_dev, Error **errp) +{ + VirtIOMEMCcw *ccw_mem = VIRTIO_MEM_CCW(ccw_dev); + DeviceState *vdev = DEVICE(&ccw_mem->vdev); + + qdev_realize(vdev, BUS(&ccw_dev->bus), errp); +} + +static void virtio_ccw_mem_set_addr(MemoryDeviceState *md, uint64_t addr, + Error **errp) +{ + object_property_set_uint(OBJECT(md), VIRTIO_MEM_ADDR_PROP, addr, errp); +} + +static uint64_t virtio_ccw_mem_get_addr(const MemoryDeviceState *md) +{ + return object_property_get_uint(OBJECT(md), VIRTIO_MEM_ADDR_PROP, + &error_abort); +} + +static MemoryRegion *virtio_ccw_mem_get_memory_region(MemoryDeviceState *md, + Error **errp) +{ + VirtIOMEMCcw *ccw_mem = VIRTIO_MEM_CCW(md); + VirtIOMEM *vmem = VIRTIO_MEM(&ccw_mem->vdev); + VirtIOMEMClass *vmc = VIRTIO_MEM_GET_CLASS(vmem); + + return vmc->get_memory_region(vmem, errp); +} + +static uint64_t virtio_ccw_mem_get_plugged_size(const MemoryDeviceState *md, + Error **errp) +{ + return object_property_get_uint(OBJECT(md), VIRTIO_MEM_SIZE_PROP, + errp); +} + +static void virtio_ccw_mem_fill_device_info(const MemoryDeviceState *md, + MemoryDeviceInfo *info) +{ + VirtioMEMDeviceInfo *vi = g_new0(VirtioMEMDeviceInfo, 1); + VirtIOMEMCcw *ccw_mem = VIRTIO_MEM_CCW(md); + VirtIOMEM *vmem = VIRTIO_MEM(&ccw_mem->vdev); + VirtIOMEMClass *vpc = VIRTIO_MEM_GET_CLASS(vmem); + DeviceState *dev = DEVICE(md); + + if (dev->id) { + vi->has_id = true; + vi->id = g_strdup(dev->id); + } + + /* let the real device handle everything else */ + vpc->fill_device_info(vmem, vi); + + info->u.virtio_mem.data = vi; + info->type = MEMORY_DEVICE_INFO_KIND_VIRTIO_MEM; +} + +static void virtio_ccw_mem_size_change_notify(Notifier *notifier, void *data) +{ + VirtIOMEMCcw *ccw_mem = container_of(notifier, VirtIOMEMCcw, + size_change_notifier); + DeviceState *dev = DEVICE(ccw_mem); + const uint64_t * const size_p = data; + const char *id = NULL; + + if (dev->id) { + id = g_strdup(dev->id); + } + + qapi_event_send_memory_device_size_change(!!id, id, *size_p); +} + +static void virtio_ccw_mem_instance_init(Object *obj) +{ + VirtioCcwDevice *ccw_dev = VIRTIO_CCW_DEVICE(obj); + VirtIOMEMCcw *ccw_mem = VIRTIO_MEM_CCW(obj); + VirtIOMEMClass *vmc; + VirtIOMEM *vmem; + + ccw_dev->force_revision_1 = true; + virtio_instance_init_common(obj, &ccw_mem->vdev, sizeof(ccw_mem->vdev), + TYPE_VIRTIO_MEM); + + ccw_mem->size_change_notifier.notify = virtio_ccw_mem_size_change_notify; + vmem = VIRTIO_MEM(&ccw_mem->vdev); + vmc = VIRTIO_MEM_GET_CLASS(vmem); + /* + * We never remove the notifier again, as we expect both devices to + * disappear at the same time. + */ + vmc->add_size_change_notifier(vmem, &ccw_mem->size_change_notifier); + + object_property_add_alias(obj, VIRTIO_MEM_BLOCK_SIZE_PROP, + OBJECT(&ccw_mem->vdev), + VIRTIO_MEM_BLOCK_SIZE_PROP); + object_property_add_alias(obj, VIRTIO_MEM_SIZE_PROP, OBJECT(&ccw_mem->vdev), + VIRTIO_MEM_SIZE_PROP); + object_property_add_alias(obj, VIRTIO_MEM_REQUESTED_SIZE_PROP, + OBJECT(&ccw_mem->vdev), + VIRTIO_MEM_REQUESTED_SIZE_PROP); +} + +static Property virtio_ccw_mem_properties[] = { + DEFINE_PROP_BIT("ioeventfd", VirtioCcwDevice, flags, + VIRTIO_CCW_FLAG_USE_IOEVENTFD_BIT, true), + DEFINE_PROP_UINT32("max_revision", VirtioCcwDevice, max_rev, + VIRTIO_CCW_MAX_REV), + DEFINE_PROP_END_OF_LIST(), +}; + +static void virtio_ccw_mem_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VirtIOCCWDeviceClass *k = VIRTIO_CCW_DEVICE_CLASS(klass); + MemoryDeviceClass *mdc = MEMORY_DEVICE_CLASS(klass); + + k->realize = virtio_ccw_mem_realize; + device_class_set_props(dc, virtio_ccw_mem_properties); + set_bit(DEVICE_CATEGORY_MISC, dc->categories); + + mdc->get_addr = virtio_ccw_mem_get_addr; + mdc->set_addr = virtio_ccw_mem_set_addr; + mdc->get_plugged_size = virtio_ccw_mem_get_plugged_size; + mdc->get_memory_region = virtio_ccw_mem_get_memory_region; + mdc->fill_device_info = virtio_ccw_mem_fill_device_info; +} + +static const TypeInfo virtio_ccw_mem = { + .name = TYPE_VIRTIO_MEM_CCW, + .parent = TYPE_VIRTIO_CCW_DEVICE, + .instance_size = sizeof(VirtIOMEMCcw), + .instance_init = virtio_ccw_mem_instance_init, + .class_init = virtio_ccw_mem_class_init, + .interfaces = (InterfaceInfo[]) { + { TYPE_MEMORY_DEVICE }, + { } + }, +}; + +static void virtio_ccw_mem_register(void) +{ + type_register_static(&virtio_ccw_mem); +} + +type_init(virtio_ccw_mem_register) diff --git a/hw/s390x/virtio-ccw.h b/hw/s390x/virtio-ccw.h index c0e3355248..77aa87c41f 100644 --- a/hw/s390x/virtio-ccw.h +++ b/hw/s390x/virtio-ccw.h @@ -29,6 +29,7 @@ #endif /* CONFIG_VHOST_VSOCK */ #include "hw/virtio/virtio-gpu.h" #include "hw/virtio/virtio-input.h" +#include "hw/virtio/virtio-mem.h" #include "hw/s390x/s390_flic.h" #include "hw/s390x/css.h" @@ -256,4 +257,16 @@ typedef struct VirtIOInputHIDCcw { VirtIOInputHID vdev; } VirtIOInputHIDCcw; +/* virtio-mem-ccw */ + +#define TYPE_VIRTIO_MEM_CCW "virtio-mem-ccw" +#define VIRTIO_MEM_CCW(obj) \ + OBJECT_CHECK(VirtIOMEMCcw, (obj), TYPE_VIRTIO_MEM_CCW) + +typedef struct VirtIOMEMCcw { + VirtioCcwDevice parent_obj; + VirtIOMEM vdev; + Notifier size_change_notifier; +} VirtIOMEMCcw; + #endif From patchwork Fri Jul 24 14:37:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hildenbrand X-Patchwork-Id: 277464 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH, MAILING_LIST_MULTI, SIGNED_OFF_BY, SPF_HELO_NONE, SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 558D5C433E3 for ; Fri, 24 Jul 2020 14:43:47 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 157922065F for ; Fri, 24 Jul 2020 14:43:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="NvaEjf6u" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 157922065F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:47780 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jyyvK-00035T-AO for qemu-devel@archiver.kernel.org; Fri, 24 Jul 2020 10:43:46 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51220) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jyyrn-0005cC-Vt for qemu-devel@nongnu.org; Fri, 24 Jul 2020 10:40:08 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:31810 helo=us-smtp-1.mimecast.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1jyyri-0005ms-Dq for qemu-devel@nongnu.org; Fri, 24 Jul 2020 10:40:07 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1595601601; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Ie8F7GnIyVaznUpI713S0bySUx9tAt4Ec7k5vHxicQ0=; b=NvaEjf6ueeJDCa4/7LgP75Uyk/9ZIO8quUJDzZ9ufbG8KErvj71UUrX4A3vWkPGnziLxhJ GyQGa0O/fxsqNw+sYZSiICrRMdr1H3NBTijjGFbFlOK+oWM7eRffLlz4Kq1xR7uk7/2yuY 8c4yZ969XhICV92EhoeXHy/r8ncY3QE= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-231-E-0g_Pu4MWyCdBksMukxWA-1; Fri, 24 Jul 2020 10:38:30 -0400 X-MC-Unique: E-0g_Pu4MWyCdBksMukxWA-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 5AFCDC7466; Fri, 24 Jul 2020 14:38:29 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-94.ams2.redhat.com [10.36.113.94]) by smtp.corp.redhat.com (Postfix) with ESMTP id 04AE2710AC; Fri, 24 Jul 2020 14:38:26 +0000 (UTC) From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH RFCv3 9/9] s390x: initial support for virtio-mem Date: Fri, 24 Jul 2020 16:37:50 +0200 Message-Id: <20200724143750.59836-10-david@redhat.com> In-Reply-To: <20200724143750.59836-1-david@redhat.com> References: <20200724143750.59836-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Received-SPF: pass client-ip=207.211.31.120; envelope-from=david@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/24 08:55:06 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -30 X-Spam_score: -3.1 X-Spam_bar: --- X-Spam_report: (-3.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=-0.01, RCVD_IN_MSPIKE_WL=-0.01, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Huth , Janosch Frank , "Michael S . Tsirkin" , Heiko Carstens , Cornelia Huck , David Hildenbrand , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, Claudio Imbrenda , Richard Henderson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Let's wire up the initial, basic virtio-mem implementation in QEMU. It will have to see some important extensions (esp., resizeable allocations) before it can be considered production ready. Also, the focus on the Linux driver side is on memory hotplug, there are a lot of things optimize in the future to improve memory unplug capabilities. However, the basics are in place. Block migration for now, as we'll have to take proper care of storage keys and storage attributes. Also, make sure to not hotplug huge pages to a setup without huge pages. With a Linux guest that supports virtio-mem (and has CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE set for now), a basic example. 1. Start a VM with 2G initial memory and a virtio-mem device with a maximum capacity of 18GB (and an initial size of 300M): sudo qemu-system-s390x \ --enable-kvm \ -m 2G,maxmem=20G \ -smp 4 \ -nographic \ -chardev socket,id=monitor,path=/var/tmp/monitor,server,nowait \ -mon chardev=monitor,mode=readline \ -net nic -net user \ -hda s390x.cow2 \ -object memory-backend-ram,id=mem0,size=18G \ -device virtio-mem-ccw,id=vm0,memdev=mem0,requested-size=300M 2. Query the current size of virtio-mem device: (qemu) info memory-devices Memory device [virtio-mem]: "vm0" memaddr: 0x80000000 node: 0 requested-size: 314572800 size: 314572800 max-size: 19327352832 block-size: 1048576 memdev: /objects/mem0 3. Request to grow it to 8GB: (qemu) qom-set vm0 requested-size 8G (qemu) info memory-devices Memory device [virtio-mem]: "vm0" memaddr: 0x80000000 node: 0 requested-size: 8589934592 size: 8589934592 max-size: 19327352832 block-size: 1048576 memdev: /objects/mem0 4. Request to shrink it to 800M (might take a while, might not fully succeed, and might not be able to remove memory blocks in Linux): (qemu) qom-set vm0 requested-size 800M (qemu) info memory-devices Memory device [virtio-mem]: "vm0" memaddr: 0x80000000 node: 0 requested-size: 838860800 size: 838860800 max-size: 19327352832 block-size: 1048576 memdev: /objects/mem0 Note 1: Due to lack of resizeable allocations, we will go ahead and reserve a 18GB vmalloc area + size the QEMU RAM slot + KVM mamory slot 18GB. echo 1 > /proc/sys/vm/overcommit_memory might be required for now. In the future, this area will instead grow on actual demand and shrink when possible. Note 2: Although virtio-mem-pci is wired up as well, it does not seem to work currently on s390x due to lack of MSI-X. Signed-off-by: David Hildenbrand --- hw/s390x/Kconfig | 1 + hw/s390x/Makefile.objs | 1 + hw/s390x/s390-virtio-ccw.c | 121 ++++++++++++++++++++++++++++++++++++- hw/virtio/virtio-mem.c | 2 + 4 files changed, 123 insertions(+), 2 deletions(-) diff --git a/hw/s390x/Kconfig b/hw/s390x/Kconfig index 5e7d8a2bae..b8619c1adc 100644 --- a/hw/s390x/Kconfig +++ b/hw/s390x/Kconfig @@ -10,3 +10,4 @@ config S390_CCW_VIRTIO select SCLPCONSOLE select VIRTIO_CCW select MSI_NONBROKEN + select VIRTIO_MEM_SUPPORTED diff --git a/hw/s390x/Makefile.objs b/hw/s390x/Makefile.objs index 2a35be0cda..279080afb8 100644 --- a/hw/s390x/Makefile.objs +++ b/hw/s390x/Makefile.objs @@ -20,6 +20,7 @@ obj-$(CONFIG_VIRTIO_NET) += virtio-ccw-net.o obj-$(CONFIG_VIRTIO_BLK) += virtio-ccw-blk.o obj-$(call land,$(CONFIG_VIRTIO_9P),$(CONFIG_VIRTFS)) += virtio-ccw-9p.o obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock-ccw.o +obj-$(CONFIG_VIRTIO_MEM) += virtio-ccw-mem.o endif obj-y += css-bridge.o obj-y += ccw-device.o diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index 23b94256e0..7239f5a212 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -44,6 +44,8 @@ #include "sysemu/sysemu.h" #include "hw/s390x/pv.h" #include "migration/blocker.h" +#include "hw/mem/memory-device.h" +#include "hw/virtio/virtio-mem-pci.h" static Error *pv_mig_blocker; @@ -488,11 +490,121 @@ static void s390_machine_reset(MachineState *machine) s390_ipl_clear_reset_request(); } +static void s390_virtio_md_pre_plug(HotplugHandler *hotplug_dev, + DeviceState *dev, Error **errp) +{ + HotplugHandler *hotplug_dev2 = qdev_get_bus_hotplug_handler(dev); + MemoryDeviceState *md = MEMORY_DEVICE(dev); + MemoryDeviceClass *mdc = MEMORY_DEVICE_GET_CLASS(md); + Error *local_err = NULL; + + if (!hotplug_dev2 && dev->hotplugged) { + /* + * Without a bus hotplug handler, we cannot control the plug/unplug + * order. We should never reach this point when hotplugging, however, + * better add a safety net. + */ + error_setg(errp, "hotplug of virtio based memory devices not supported" + " on this bus."); + return; + } + + /* + * KVM does not support device memory with a bigger page size than initial + * memory. The new memory backend is not mapped yet, so + * qemu_maxrampagesize() won't consider it. + */ + if (kvm_enabled()) { + MemoryRegion *mr = mdc->get_memory_region(md, &local_err); + + if (local_err) { + goto out; + } + if (qemu_ram_pagesize(mr->ram_block) > qemu_maxrampagesize()) { + error_setg(&local_err, "Device memory has a bigger page size than" + " initial memory"); + goto out; + } + } + + /* + * First, see if we can plug this memory device at all. If that + * succeeds, branch of to the actual hotplug handler. + */ + memory_device_pre_plug(md, MACHINE(hotplug_dev), NULL, &local_err); + if (!local_err && hotplug_dev2) { + hotplug_handler_pre_plug(hotplug_dev2, dev, &local_err); + } +out: + error_propagate(errp, local_err); +} + +static void s390_virtio_md_plug(HotplugHandler *hotplug_dev, + DeviceState *dev, Error **errp) +{ + HotplugHandler *hotplug_dev2 = qdev_get_bus_hotplug_handler(dev); + static Error *migration_blocker; + bool add_blocker = !migration_blocker; + Error *local_err = NULL; + + /* + * Until we support migration of storage keys and storage attributes + * for anything that's not initial memory, let's block migration. + */ + if (add_blocker) { + error_setg(&migration_blocker, "storage keys/attributes not yet" + " migrated for memory devices"); + migrate_add_blocker(migration_blocker, &local_err); + if (local_err) { + error_free_or_abort(&migration_blocker); + goto out; + } + } + + /* + * Plug the memory device first and then branch off to the actual + * hotplug handler. If that one fails, we can easily undo the memory + * device bits. + */ + memory_device_plug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev)); + if (hotplug_dev2) { + hotplug_handler_plug(hotplug_dev2, dev, &local_err); + if (local_err) { + memory_device_unplug(MEMORY_DEVICE(dev), MACHINE(hotplug_dev)); + if (add_blocker) { + migrate_del_blocker(migration_blocker); + error_free_or_abort(&migration_blocker); + } + } + } +out: + error_propagate(errp, local_err); +} + +static void s390_virtio_md_unplug_request(HotplugHandler *hotplug_dev, + DeviceState *dev, Error **errp) +{ + /* We don't support hot unplug of virtio based memory devices */ + error_setg(errp, "virtio based memory devices cannot be unplugged."); +} + +static void s390_machine_device_pre_plug(HotplugHandler *hotplug_dev, + DeviceState *dev, Error **errp) +{ + if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_CCW) || + object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { + s390_virtio_md_pre_plug(hotplug_dev, dev, errp); + } +} + static void s390_machine_device_plug(HotplugHandler *hotplug_dev, DeviceState *dev, Error **errp) { if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { s390_cpu_plug(hotplug_dev, dev, errp); + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_CCW) || + object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { + s390_virtio_md_plug(hotplug_dev, dev, errp); } } @@ -501,7 +613,9 @@ static void s390_machine_device_unplug_request(HotplugHandler *hotplug_dev, { if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { error_setg(errp, "CPU hot unplug not supported on this machine"); - return; + } else if (object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_CCW) || + object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { + s390_virtio_md_unplug_request(hotplug_dev, dev, errp); } } @@ -542,7 +656,9 @@ static const CPUArchIdList *s390_possible_cpu_arch_ids(MachineState *ms) static HotplugHandler *s390_get_hotplug_handler(MachineState *machine, DeviceState *dev) { - if (object_dynamic_cast(OBJECT(dev), TYPE_CPU)) { + if (object_dynamic_cast(OBJECT(dev), TYPE_CPU) || + object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_CCW) || + object_dynamic_cast(OBJECT(dev), TYPE_VIRTIO_MEM_PCI)) { return HOTPLUG_HANDLER(machine); } return NULL; @@ -614,6 +730,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data) mc->possible_cpu_arch_ids = s390_possible_cpu_arch_ids; /* it is overridden with 'host' cpu *in kvm_arch_init* */ mc->default_cpu_type = S390_CPU_TYPE_NAME("qemu"); + hc->pre_plug = s390_machine_device_pre_plug; hc->plug = s390_machine_device_plug; hc->unplug_request = s390_machine_device_unplug_request; nc->nmi_monitor_handler = s390_nmi; diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c index c12e9f79b0..fce86e4411 100644 --- a/hw/virtio/virtio-mem.c +++ b/hw/virtio/virtio-mem.c @@ -53,6 +53,8 @@ */ #if defined(TARGET_X86_64) || defined(TARGET_I386) #define VIRTIO_MEM_USABLE_EXTENT (2 * (128 * MiB)) +#elif defined(TARGET_S390X) +#define VIRTIO_MEM_USABLE_EXTENT (2 * (256 * MiB)) #else #error VIRTIO_MEM_USABLE_EXTENT not defined #endif