From patchwork Wed Jul 8 18:51:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hildenbrand X-Patchwork-Id: 11652845 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E735B60D for ; Wed, 8 Jul 2020 22:26:18 +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 BB5E720772 for ; Wed, 8 Jul 2020 22:26:18 +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="ZDBDlMkp" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BB5E720772 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:44748 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jtIW9-0002cz-UN for patchwork-qemu-devel@patchwork.kernel.org; Wed, 08 Jul 2020 18:26:17 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40642) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jtHzK-00041g-6j for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:52:22 -0400 Received: from us-smtp-1.mimecast.com ([207.211.31.81]:21043 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 1jtHzI-0005G8-CK for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:52:21 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594245139; 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=ibC8VBxKDigT75V4r6cBk01+W7vG9M45onQMHCdIq18=; b=ZDBDlMkpTPavJ51JXUkMzoDcqksIBQsVEJe8jwxyVN3F/hHWUM+4wy79q5u90cHzfT13lG NnwvbeVnJagCs9+0LzRAkHGN9XkMiiVsJeO+xkXk/QjIJz7LOqOG93xUYtCE3XKkud4y5z 64s6SJmNfD+t4Zc/0ynPQUHBXVt70/8= 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-216-TTI4SnaMMM6CVVsPbzBsLg-1; Wed, 08 Jul 2020 14:51:56 -0400 X-MC-Unique: TTI4SnaMMM6CVVsPbzBsLg-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B32918015F5; Wed, 8 Jul 2020 18:51:52 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-117.ams2.redhat.com [10.36.113.117]) by smtp.corp.redhat.com (Postfix) with ESMTP id C49EA7554B; Wed, 8 Jul 2020 18:51:47 +0000 (UTC) From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH RFC 1/5] s390x: move setting of maximum ram size to machine init Date: Wed, 8 Jul 2020 20:51:31 +0200 Message-Id: <20200708185135.46694-2-david@redhat.com> In-Reply-To: <20200708185135.46694-1-david@redhat.com> References: <20200708185135.46694-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 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/07 17:25:09 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" , Cornelia Huck , Heiko Carstens , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, David Hildenbrand , Claudio Imbrenda , Richard Henderson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.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 | 20 +------------------- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index 023fd25f2b..2e6d292c23 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -160,13 +160,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 @@ -249,7 +262,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 d39f6d7785..f59195e15a 100644 --- a/hw/s390x/sclp.c +++ b/hw/s390x/sclp.c @@ -327,32 +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); - Error *err = NULL; - 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. */ - sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), &err); - if (err) { - goto out; - } - - ret = s390_set_memory_limit(machine->maxram_size, &hw_limit); - if (ret == -E2BIG) { - error_setg(&err, "host supports a maximum of %" PRIu64 " GB", - hw_limit / GiB); - } else if (ret) { - error_setg(&err, "setting the guest size failed"); - } - -out: - error_propagate(errp, err); + sysbus_realize(SYS_BUS_DEVICE(sclp->event_facility), errp); } static void sclp_memory_init(SCLPDevice *sclp) From patchwork Wed Jul 8 18:51:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hildenbrand X-Patchwork-Id: 11652839 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3B14860D for ; Wed, 8 Jul 2020 22:22:44 +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 12C4C20772 for ; Wed, 8 Jul 2020 22:22:44 +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="SljljaII" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 12C4C20772 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:55854 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jtISh-0003w0-Aw for patchwork-qemu-devel@patchwork.kernel.org; Wed, 08 Jul 2020 18:22:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40740) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jtHzc-0004Xu-BF for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:52:40 -0400 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:22728 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 1jtHza-0005Hf-1W for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:52:40 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594245157; 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=lvsml5SkldcIC+94tbIyaovLnNYw/WpFjcjBx3vvPBk=; b=SljljaIIKk0NyrsPoBOv3omPwbgk2i9YVI/FXcwJTiwiwmchszk303r6KmMHvSJTJelT/5 3uSAyd/xHV7wJjMANu8o77hp6IYxA24VIa4Wu4KzlB2ML2KIIh+byMDeIqHlTWhu3Qa/hD 5fA1+wnL3b5RtoppZofy7gZ5egUh4+A= 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-460-6k6sN3VPPhKaCTv42SwX9A-1; Wed, 08 Jul 2020 14:52:15 -0400 X-MC-Unique: 6k6sN3VPPhKaCTv42SwX9A-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 270D1801E6A; Wed, 8 Jul 2020 18:52:14 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-117.ams2.redhat.com [10.36.113.117]) by smtp.corp.redhat.com (Postfix) with ESMTP id 0ACA87554B; Wed, 8 Jul 2020 18:51:52 +0000 (UTC) From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH RFC 2/5] s390x: implement diag260 Date: Wed, 8 Jul 2020 20:51:32 +0200 Message-Id: <20200708185135.46694-3-david@redhat.com> In-Reply-To: <20200708185135.46694-1-david@redhat.com> References: <20200708185135.46694-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 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=205.139.110.61; envelope-from=david@redhat.com; helo=us-smtp-delivery-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/07 17:25:10 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -40 X-Spam_score: -4.1 X-Spam_bar: ---- X-Spam_report: (-4.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_H2=-1, 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" , Cornelia Huck , Heiko Carstens , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, David Hildenbrand , Claudio Imbrenda , Richard Henderson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Let's implement the "storage configuration" part of diag260. This diag is found under z/VM, to indicate usable chunks of memory tot he guest OS. As I don't have access to documentation, I have no clue what the actual error cases are, and which other stuff we could eventually query using this interface. Somebody with access to documentation should fix this. This implementation seems to work with Linux guests just fine. The Linux kernel supports diag260 to query the available memory since v4.20. Older kernels / kvm-unit-tests will later fail to run in such a VM (with maxmem being defined and bigger than the memory size, e.g., "-m 2G,maxmem=4G"), just as if support for SCLP storage information is not implemented. They will fail to detect the actual initial memory size. This interface allows us to expose the maximum ramsize via sclp and the initial ramsize via diag260 - without having to mess with the memory increment size and having to align the initial memory size to it. This is a preparation for memory device support. We'll unlock the implementation with a new QEMU machine that supports memory devices. Signed-off-by: David Hildenbrand --- target/s390x/diag.c | 57 ++++++++++++++++++++++++++++++++++++++ target/s390x/internal.h | 2 ++ target/s390x/kvm.c | 11 ++++++++ target/s390x/misc_helper.c | 6 ++++ target/s390x/translate.c | 4 +++ 5 files changed, 80 insertions(+) diff --git a/target/s390x/diag.c b/target/s390x/diag.c index 1a48429564..c3b1e24b2c 100644 --- a/target/s390x/diag.c +++ b/target/s390x/diag.c @@ -23,6 +23,63 @@ #include "hw/s390x/pv.h" #include "kvm_s390x.h" +void handle_diag_260(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra) +{ + MachineState *ms = MACHINE(qdev_get_machine()); + const ram_addr_t initial_ram_size = ms->ram_size; + const uint64_t subcode = env->regs[r3]; + S390CPU *cpu = env_archcpu(env); + ram_addr_t addr, length; + uint64_t tmp; + + /* TODO: Unlock with new QEMU machine. */ + if (false) { + s390_program_interrupt(env, PGM_OPERATION, ra); + return; + } + + /* + * There also seems to be subcode "0xc", which stores the size of the + * first chunk and the total size to r1/r2. It's only used by very old + * Linux, so don't implement it. + */ + if ((r1 & 1) || subcode != 0x10) { + s390_program_interrupt(env, PGM_SPECIFICATION, ra); + return; + } + addr = env->regs[r1]; + length = env->regs[r1 + 1]; + + /* FIXME: Somebody with documentation should fix this. */ + if (!QEMU_IS_ALIGNED(addr, 16) || !QEMU_IS_ALIGNED(length, 16)) { + s390_program_interrupt(env, PGM_SPECIFICATION, ra); + return; + } + + /* FIXME: Somebody with documentation should fix this. */ + if (!length) { + setcc(cpu, 3); + return; + } + + /* FIXME: Somebody with documentation should fix this. */ + if (!address_space_access_valid(&address_space_memory, addr, length, true, + MEMTXATTRS_UNSPECIFIED)) { + s390_program_interrupt(env, PGM_ADDRESSING, ra); + return; + } + + /* Indicate our initial memory ([0 .. ram_size - 1]) */ + tmp = cpu_to_be64(0); + cpu_physical_memory_write(addr, &tmp, sizeof(tmp)); + tmp = cpu_to_be64(initial_ram_size - 1); + cpu_physical_memory_write(addr + sizeof(tmp), &tmp, sizeof(tmp)); + + /* Exactly one entry was stored. */ + env->regs[r3] = 1; + setcc(cpu, 0); +} + int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3) { uint64_t func = env->regs[r1]; diff --git a/target/s390x/internal.h b/target/s390x/internal.h index b1e0ebf67f..a7a3df9a3b 100644 --- a/target/s390x/internal.h +++ b/target/s390x/internal.h @@ -372,6 +372,8 @@ int mmu_translate_real(CPUS390XState *env, target_ulong raddr, int rw, /* misc_helper.c */ +void handle_diag_260(CPUS390XState *env, uint64_t r1, uint64_t r3, + uintptr_t ra); int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3); void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra); diff --git a/target/s390x/kvm.c b/target/s390x/kvm.c index f2f75d2a57..d6de3ad86c 100644 --- a/target/s390x/kvm.c +++ b/target/s390x/kvm.c @@ -1565,6 +1565,14 @@ static int handle_hypercall(S390CPU *cpu, struct kvm_run *run) return ret; } +static void kvm_handle_diag_260(S390CPU *cpu, struct kvm_run *run) +{ + const uint64_t r1 = (run->s390_sieic.ipa & 0x00f0) >> 4; + const uint64_t r3 = run->s390_sieic.ipa & 0x000f; + + handle_diag_260(&cpu->env, r1, r3, 0); +} + static void kvm_handle_diag_288(S390CPU *cpu, struct kvm_run *run) { uint64_t r1, r3; @@ -1614,6 +1622,9 @@ static int handle_diag(S390CPU *cpu, struct kvm_run *run, uint32_t ipb) */ func_code = decode_basedisp_rs(&cpu->env, ipb, NULL) & DIAG_KVM_CODE_MASK; switch (func_code) { + case 0x260: + kvm_handle_diag_260(cpu, run); + break; case DIAG_TIMEREVENT: kvm_handle_diag_288(cpu, run); break; diff --git a/target/s390x/misc_helper.c b/target/s390x/misc_helper.c index 58dbc023eb..d7274eb320 100644 --- a/target/s390x/misc_helper.c +++ b/target/s390x/misc_helper.c @@ -116,6 +116,12 @@ void HELPER(diag)(CPUS390XState *env, uint32_t r1, uint32_t r3, uint32_t num) uint64_t r; switch (num) { + case 0x260: + qemu_mutex_lock_iothread(); + handle_diag_260(env, r1, r3, GETPC()); + qemu_mutex_unlock_iothread(); + r = 0; + break; case 0x500: /* KVM hypercall */ qemu_mutex_lock_iothread(); diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 4f6f1e31cd..6bb8b6e513 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -2398,6 +2398,10 @@ static DisasJumpType op_diag(DisasContext *s, DisasOps *o) TCGv_i32 func_code = tcg_const_i32(get_field(s, i2)); gen_helper_diag(cpu_env, r1, r3, func_code); + /* Only some diags modify the CC. */ + if (get_field(s, i2) == 0x260) { + set_cc_static(s); + } tcg_temp_free_i32(func_code); tcg_temp_free_i32(r3); From patchwork Wed Jul 8 18:51:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hildenbrand X-Patchwork-Id: 11652829 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 339B2618 for ; Wed, 8 Jul 2020 22:17:56 +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 0BA48206DF for ; Wed, 8 Jul 2020 22:17:56 +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="WUQQVqEH" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0BA48206DF 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:34088 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jtIO3-0002vA-As for patchwork-qemu-devel@patchwork.kernel.org; Wed, 08 Jul 2020 18:17:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:41182) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jtI1z-00008X-Th for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:55:07 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:36948 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 1jtI1w-0005UA-8w for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:55:07 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594245303; 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=HSQN2wd8AGom8QPbQzKv4jp1CAWKOE/xbA8e4d059kA=; b=WUQQVqEHO2RIwgw8tFRS29rcYHtUJTZwXSb9O0X2/o18VXdm9ctw2QN6B7AM86WPmfa/eX T6ExbjRSQAqccVzBI00z+5HyCVJhh3luACN8EE3y355NdE1h/TUY8LLYf9QrYlSQJBiO7b aErJUtAjR3hna3gAEgQV28+PU0WEM+g= 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-491-jYDfx538O2qUXCYuJUQriA-1; Wed, 08 Jul 2020 14:52:22 -0400 X-MC-Unique: jYDfx538O2qUXCYuJUQriA-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id CCAFE1095; Wed, 8 Jul 2020 18:52:20 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-117.ams2.redhat.com [10.36.113.117]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7307C7880B; Wed, 8 Jul 2020 18:52:14 +0000 (UTC) From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH RFC 3/5] s390x: prepare device memory address space Date: Wed, 8 Jul 2020 20:51:33 +0200 Message-Id: <20200708185135.46694-4-david@redhat.com> In-Reply-To: <20200708185135.46694-1-david@redhat.com> References: <20200708185135.46694-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 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.120; envelope-from=david@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/07 17:25:10 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -40 X-Spam_score: -4.1 X-Spam_bar: ---- X-Spam_report: (-4.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_H2=-1, 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" , Cornelia Huck , Heiko Carstens , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, David Hildenbrand , Claudio Imbrenda , Richard Henderson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" Let's allocate the device memory information and setup the device memory address space. Expose the maximum ramsize via SCLP and the actual initial ramsize via diag260. Signed-off-by: David Hildenbrand --- hw/s390x/s390-virtio-ccw.c | 43 ++++++++++++++++++++++++++++++ hw/s390x/sclp.c | 12 +++++++-- include/hw/s390x/s390-virtio-ccw.h | 3 +++ target/s390x/diag.c | 4 +-- 4 files changed, 58 insertions(+), 4 deletions(-) diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c index 2e6d292c23..577590e623 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -160,6 +160,35 @@ static void virtio_ccw_register_hcalls(void) virtio_ccw_hcall_early_printk); } +static void s390_device_memory_init(MachineState *machine) +{ + MemoryRegion *sysmem = get_system_memory(); + + machine->device_memory = g_malloc0(sizeof(*machine->device_memory)); + + /* initialize device memory address space */ + if (machine->ram_size < machine->maxram_size) { + ram_addr_t device_mem_size = machine->maxram_size - machine->ram_size; + + if (QEMU_ALIGN_UP(machine->maxram_size, MiB) != machine->maxram_size) { + error_report("maximum memory size must by aligned to 1 MB"); + exit(EXIT_FAILURE); + } + + machine->device_memory->base = machine->ram_size; + if (machine->device_memory->base + device_mem_size < device_mem_size) { + error_report("unsupported amount of maximum memory: " RAM_ADDR_FMT, + machine->maxram_size); + exit(EXIT_FAILURE); + } + + memory_region_init(&machine->device_memory->mr, OBJECT(machine), + "device-memory", device_mem_size); + memory_region_add_subregion(sysmem, machine->device_memory->base, + &machine->device_memory->mr); + } +} + static void s390_memory_init(MachineState *machine) { MemoryRegion *sysmem = get_system_memory(); @@ -194,6 +223,11 @@ static void s390_memory_init(MachineState *machine) s390_skeys_init(); /* Initialize storage attributes device */ s390_stattrib_init(); + + /* Support for memory devices is glued to compat machines. */ + if (memory_devices_allowed()) { + s390_device_memory_init(machine); + } } static void s390_init_ipl_dev(const char *kernel_filename, @@ -617,6 +651,7 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data) s390mc->cpu_model_allowed = true; s390mc->css_migration_enabled = true; s390mc->hpage_1m_allowed = true; + s390mc->memory_devices_allowed = true; mc->init = ccw_init; mc->reset = s390_machine_reset; mc->hot_add_cpu = s390_hot_add_cpu; @@ -713,6 +748,11 @@ bool hpage_1m_allowed(void) return get_machine_class()->hpage_1m_allowed; } +bool memory_devices_allowed(void) +{ + return get_machine_class()->memory_devices_allowed; +} + static char *machine_get_loadparm(Object *obj, Error **errp) { S390CcwMachineState *ms = S390_CCW_MACHINE(obj); @@ -831,8 +871,11 @@ static void ccw_machine_5_0_instance_options(MachineState *machine) static void ccw_machine_5_0_class_options(MachineClass *mc) { + S390CcwMachineClass *s390mc = S390_MACHINE_CLASS(mc); + ccw_machine_5_1_class_options(mc); compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len); + s390mc->memory_devices_allowed = false; } DEFINE_CCW_MACHINE(5_0, "5.0", false); diff --git a/hw/s390x/sclp.c b/hw/s390x/sclp.c index f59195e15a..85d3505597 100644 --- a/hw/s390x/sclp.c +++ b/hw/s390x/sclp.c @@ -22,6 +22,7 @@ #include "hw/s390x/event-facility.h" #include "hw/s390x/s390-pci-bus.h" #include "hw/s390x/ipl.h" +#include "hw/s390x/s390-virtio-ccw.h" static inline SCLPDevice *get_sclp_device(void) { @@ -110,8 +111,15 @@ static void read_SCP_info(SCLPDevice *sclp, SCCB *sccb) read_info->rnsize2 = cpu_to_be32(rnsize); } - /* we don't support standby memory, maxram_size is never exposed */ - rnmax = machine->ram_size >> sclp->increment_size; + /* + * Support for maxram was added with support for memory devices. The + * size of the initial memory is exposed via diag260. + */ + if (memory_devices_allowed()) { + rnmax = machine->maxram_size >> sclp->increment_size; + } else { + rnmax = machine->ram_size >> sclp->increment_size; + } if (rnmax < 0x10000) { read_info->rnmax = cpu_to_be16(rnmax); } else { diff --git a/include/hw/s390x/s390-virtio-ccw.h b/include/hw/s390x/s390-virtio-ccw.h index cd1dccc6e3..3a1e7e2a6d 100644 --- a/include/hw/s390x/s390-virtio-ccw.h +++ b/include/hw/s390x/s390-virtio-ccw.h @@ -41,6 +41,7 @@ typedef struct S390CcwMachineClass { bool cpu_model_allowed; bool css_migration_enabled; bool hpage_1m_allowed; + bool memory_devices_allowed; } S390CcwMachineClass; /* runtime-instrumentation allowed by the machine */ @@ -49,6 +50,8 @@ bool ri_allowed(void); bool cpu_model_allowed(void); /* 1M huge page mappings allowed by the machine */ bool hpage_1m_allowed(void); +/* Allow memory devices and diag260. */ +bool memory_devices_allowed(void); /** * Returns true if (vmstate based) migration of the channel subsystem diff --git a/target/s390x/diag.c b/target/s390x/diag.c index c3b1e24b2c..6b33eb0efc 100644 --- a/target/s390x/diag.c +++ b/target/s390x/diag.c @@ -32,8 +32,8 @@ void handle_diag_260(CPUS390XState *env, uint64_t r1, uint64_t r3, uintptr_t ra) ram_addr_t addr, length; uint64_t tmp; - /* TODO: Unlock with new QEMU machine. */ - if (false) { + /* Support for diag260 is glued to support for memory devices. */ + if (!memory_devices_allowed()) { s390_program_interrupt(env, PGM_OPERATION, ra); return; } From patchwork Wed Jul 8 18:51:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hildenbrand X-Patchwork-Id: 11652825 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 832EF13B4 for ; Wed, 8 Jul 2020 22:16:23 +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 5AFFB206DF for ; Wed, 8 Jul 2020 22:16:23 +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="LM44NXiH" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5AFFB206DF 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:54038 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jtIMY-0007gy-Gn for patchwork-qemu-devel@patchwork.kernel.org; Wed, 08 Jul 2020 18:16:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:41010) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jtI15-00074T-2h for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:54:11 -0400 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:25537 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 1jtI12-0005PL-9D for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:54:10 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594245247; 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=v4uhjNGnAQMFkLG05VfEYjwnS7zj/yCgK71U9QUEwOY=; b=LM44NXiHrRtUn7e9Oumz+tqQv3gqRROUWTYbv/MTHZWbs/oapYVsmSxxVo6RlQ7MYo8jZP cjqh+WyGtc3dY6ycP+SG8fSh/XDgDGnGOiWJFibfJv2JXzLfLFgyt6FsQzTZKMAAdVNRnz BYy9CDalmHRxo4KdXtNWfmpo1c+Sq+k= 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-105-BxonDbzXM-6hBoX93yWc8g-1; Wed, 08 Jul 2020 14:52:29 -0400 X-MC-Unique: BxonDbzXM-6hBoX93yWc8g-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 4C716107ACF3; Wed, 8 Jul 2020 18:52:28 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-117.ams2.redhat.com [10.36.113.117]) by smtp.corp.redhat.com (Postfix) with ESMTP id 24DC25D9F3; Wed, 8 Jul 2020 18:52:20 +0000 (UTC) From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH RFC 4/5] s390x: implement virtio-mem-ccw Date: Wed, 8 Jul 2020 20:51:34 +0200 Message-Id: <20200708185135.46694-5-david@redhat.com> In-Reply-To: <20200708185135.46694-1-david@redhat.com> References: <20200708185135.46694-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 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=205.139.110.61; envelope-from=david@redhat.com; helo=us-smtp-delivery-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/07 17:25:10 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -40 X-Spam_score: -4.1 X-Spam_bar: ---- X-Spam_report: (-4.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_H2=-1, 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" , Cornelia Huck , Heiko Carstens , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, David Hildenbrand , Claudio Imbrenda , Richard Henderson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.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 | 165 ++++++++++++++++++++++++++++++++++++++ hw/s390x/virtio-ccw.h | 13 +++ 2 files changed, 178 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..ae856d7ad4 --- /dev/null +++ b/hw/s390x/virtio-ccw-mem.c @@ -0,0 +1,165 @@ +/* + * 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), addr, VIRTIO_MEM_ADDR_PROP, 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) +{ + VirtIOMEMCcw *ccw_mem = VIRTIO_MEM_CCW(obj); + VirtIOMEMClass *vmc; + VirtIOMEM *vmem; + + 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 Wed Jul 8 18:51:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Hildenbrand X-Patchwork-Id: 11652841 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id AAD0113B4 for ; Wed, 8 Jul 2020 22:24:35 +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 70FD320772 for ; Wed, 8 Jul 2020 22:24:35 +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="bZWJX8OS" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 70FD320772 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Received: from localhost ([::1]:37660 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jtIUU-000827-Np for patchwork-qemu-devel@patchwork.kernel.org; Wed, 08 Jul 2020 18:24:34 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:40886) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jtI0K-0005nl-Hq for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:53:24 -0400 Received: from us-smtp-delivery-1.mimecast.com ([207.211.31.120]:29222 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 1jtI0I-0005LV-9s for qemu-devel@nongnu.org; Wed, 08 Jul 2020 17:53:24 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1594245201; 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=cedthYX9XANVte4Y0kCgMXK9EVZ7zMFGGO304Vk6GPU=; b=bZWJX8OS5kKFFuy5LCcUFWtZFpaWwzYma3SY+82vlQ6HSeRxu9n+gqdrHeyHoNh7AuhegA BmJLvYSULNFZNqqEJ3JGIvymGw+gcQTkt9dzwd8QdY2Zi6nlzPHJqWIr5klwI6EFKtD88T Iz7uACTIMAVa7+DpJ4rXP178AgH440A= 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-311-P62WhY8wPrWW435dLj4wmg-1; Wed, 08 Jul 2020 14:52:43 -0400 X-MC-Unique: P62WhY8wPrWW435dLj4wmg-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 04F531E0A; Wed, 8 Jul 2020 18:52:40 +0000 (UTC) Received: from t480s.redhat.com (ovpn-113-117.ams2.redhat.com [10.36.113.117]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9AE725D9F3; Wed, 8 Jul 2020 18:52:28 +0000 (UTC) From: David Hildenbrand To: qemu-devel@nongnu.org Subject: [PATCH RFC 5/5] s390x: initial support for virtio-mem Date: Wed, 8 Jul 2020 20:51:35 +0200 Message-Id: <20200708185135.46694-6-david@redhat.com> In-Reply-To: <20200708185135.46694-1-david@redhat.com> References: <20200708185135.46694-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 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.120; envelope-from=david@redhat.com; helo=us-smtp-1.mimecast.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/07/07 17:25:10 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x [generic] [fuzzy] X-Spam_score_int: -40 X-Spam_score: -4.1 X-Spam_bar: ---- X-Spam_report: (-4.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_H2=-1, 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" , Cornelia Huck , Heiko Carstens , Halil Pasic , Christian Borntraeger , qemu-s390x@nongnu.org, David Hildenbrand , Claudio Imbrenda , Richard Henderson Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.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: 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. Signed-off-by: David Hildenbrand --- hw/s390x/Kconfig | 1 + hw/s390x/Makefile.objs | 1 + hw/s390x/s390-virtio-ccw.c | 116 ++++++++++++++++++++++++++++++++++++- hw/virtio/virtio-mem.c | 2 + 4 files changed, 118 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 a46a1c7894..924775d6f0 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 577590e623..e714035077 100644 --- a/hw/s390x/s390-virtio-ccw.c +++ b/hw/s390x/s390-virtio-ccw.c @@ -45,6 +45,7 @@ #include "sysemu/sysemu.h" #include "hw/s390x/pv.h" #include "migration/blocker.h" +#include "hw/mem/memory-device.h" static Error *pv_mig_blocker; @@ -542,11 +543,119 @@ 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)) { + 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)) { + s390_virtio_md_plug(hotplug_dev, dev, errp); } } @@ -555,7 +664,8 @@ 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)) { + s390_virtio_md_unplug_request(hotplug_dev, dev, errp); } } @@ -596,7 +706,8 @@ 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)) { return HOTPLUG_HANDLER(machine); } return NULL; @@ -668,6 +779,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 65850530e7..e1b3275089 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