Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp674234ybz; Fri, 17 Apr 2020 08:04:47 -0700 (PDT) X-Google-Smtp-Source: APiQypK6gWnBBq053toInY4zV2pdShsxix+r2oDu03JV2YX/XVTRDBjZLYH/LoxstHt/ODyUwCqy X-Received: by 2002:a50:d942:: with SMTP id u2mr3504940edj.116.1587135886966; Fri, 17 Apr 2020 08:04:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587135886; cv=none; d=google.com; s=arc-20160816; b=Sz8R+pdZ+FFW5DrJ3IomUVAtXORN9tvlCAkrsIS+RYsDiCj1eZakIkdwmSe0/OAduQ KAqc1NppuBBgw+j8bTvLzjAaEG31ne07PTpg53kOkazCQkkWj933kq2fGZA6oFC4CDYa 3oWUa4wuso4Y+EPSB6j8ofjq/P7y+ApH4uUUVlWwTv0dUWoax0/ShiG34So/8lcWkMiW 6TtqjxLuT4kdrtuZFlUZlsRi4qUVWZknGXVcGnpsFc290VO8OqJ/i/0lEyVPcvMl9STN Lw4rdHPOdtbPPu4ObDb9GDvh/IzHF8tKpLmdHVK43MPt2v5bEtXOpulLZOoBklHFSq5Q oFvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=TW9GKMvgpVoGQAKpbRkZDaLCYXUQd5fcsEo9OJKKyeU=; b=H0z6NJ5q+tut3lwaLLdRCkAHFQH8/3rzh/Gul/wuWudsujw9jPaQUp/CT8jnZsL+D9 aqRAurn5ZHmWMKSQYzq31P4a4k7X1mtruoIyK+Grxa7u17LZQ6Ju2gSqdMsfiv8ucstp 7E6ypF+D5/K9E0GR7bUx4gDrryAXdpdJgoWP0vLtsaRmYwXRcqLP/rsDPjmXuz54rgD5 ODknylJuV26PvvttQeuGI1Po5v09JWhey7XHdZaDrmUeUL950XGNVxmOUkbPDEprcZmB roqKw0vecVfSFYlATj4DQNK+O//JYwiyCN5522rnTsiHD2C8Bn1Mdan/61OnbTFiC88N E0MQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=fnZCObWN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ec12si14002429ejb.346.2020.04.17.08.04.10; Fri, 17 Apr 2020 08:04:46 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=fnZCObWN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728413AbgDQPCJ (ORCPT + 99 others); Fri, 17 Apr 2020 11:02:09 -0400 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:60752 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728296AbgDQPCH (ORCPT ); Fri, 17 Apr 2020 11:02:07 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1587135725; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=TW9GKMvgpVoGQAKpbRkZDaLCYXUQd5fcsEo9OJKKyeU=; b=fnZCObWNyvyiGtHg3PIgZC9u63sIVl66ZL979/XLeWhXcKgwgDxNOYwJ8fDiWZdu77Ml21 Lwig2H2cD0Rd77MjDUhiuYPV4aJL6M1HfAl67EedWjnzDFG6loNjsDQ1uyQDA0gbSDueFQ 2JpU9doDH18xlPEDxPi6X72H0zMjoZw= 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-300-AaD_PUg0OJqBlHU0pUVQ0A-1; Fri, 17 Apr 2020 11:02:01 -0400 X-MC-Unique: AaD_PUg0OJqBlHU0pUVQ0A-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 100748018A1; Fri, 17 Apr 2020 15:02:00 +0000 (UTC) Received: from t480s.redhat.com (ovpn-114-107.ams2.redhat.com [10.36.114.107]) by smtp.corp.redhat.com (Postfix) with ESMTP id F16AE9F9B5; Fri, 17 Apr 2020 15:01:57 +0000 (UTC) From: David Hildenbrand To: linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org, linux-s390@vger.kernel.org, David Hildenbrand , Heiko Carstens , Vasily Gorbik , Christian Borntraeger , Philipp Rudo , Kirill Smelkov , Michael Holzheu Subject: [PATCH RFC 1/2] s390/zcore: traverse resources instead of memblocks Date: Fri, 17 Apr 2020 17:01:50 +0200 Message-Id: <20200417150151.17239-2-david@redhat.com> In-Reply-To: <20200417150151.17239-1-david@redhat.com> References: <20200417150151.17239-1-david@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The zcore memmap basically contains the first level of all system RAM fro= m /proc/iomem. We want to disable CONFIG_ARCH_KEEP_MEMBLOCK (e.g., to not create memblocks for hotplugged/standby memory and save space), switch to traversing system ram resources instead. During early boot, we create resources for all early memblocks (including the crash kernel area). When adding standby memory, we currently create both, memblocks and resources. Note: As we don't have memory hotplug after boot (standby memory is added via sclp during boot), we don't have to worry about races. I am only able to test under KVM (where I hacked up zcore to still create the memmap file) root@vm0:~# cat /proc/iomem 00000000-2fffffff : System RAM 10424000-10ec6fff : Kernel code 10ec7000-1139a0e3 : Kernel data 1177a000-11850fff : Kernel bss 30000000-3fffffff : Crash kernel Result without this patch: root@vm0:~# cat /sys/kernel/debug/zcore/memmap 0000000000000000 0000000040000000 Result with this patch: root@vm0:~# cat /sys/kernel/debug/zcore/memmap 0000000000000000 0000000030000000 0000000030000000 0000000010000000 The difference is due to memblocks getting merged, resources (currently) not. So we might have some more entries, but they describe the same memory map. Cc: Heiko Carstens Cc: Vasily Gorbik Cc: Christian Borntraeger Cc: Philipp Rudo Cc: Kirill Smelkov Cc: Michael Holzheu Signed-off-by: David Hildenbrand --- drivers/s390/char/zcore.c | 61 ++++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/drivers/s390/char/zcore.c b/drivers/s390/char/zcore.c index 08f812475f5e..c40ac7d548d8 100644 --- a/drivers/s390/char/zcore.c +++ b/drivers/s390/char/zcore.c @@ -16,7 +16,7 @@ #include #include #include -#include +#include =20 #include #include @@ -139,35 +139,70 @@ static void release_hsa(void) hsa_available =3D 0; } =20 +struct zcore_memmap_info { + char *buf; + size_t length; +}; + static ssize_t zcore_memmap_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos) { - return simple_read_from_buffer(buf, count, ppos, filp->private_data, - memblock.memory.cnt * CHUNK_INFO_SIZE); + struct zcore_memmap_info *info =3D filp->private_data; + + return simple_read_from_buffer(buf, count, ppos, info->buf, + info->length); +} + +static int zcore_count_ram_resource(struct resource *res, void *arg) +{ + size_t *count =3D arg; + + *count +=3D 1; + return 0; +} + +static int zcore_process_ram_resource(struct resource *res, void *arg) +{ + char **buf =3D arg; + + sprintf(*buf, "%016lx %016lx ", (unsigned long) res->start, + (unsigned long) resource_size(res)); + + *buf +=3D CHUNK_INFO_SIZE; + return 0; } =20 static int zcore_memmap_open(struct inode *inode, struct file *filp) { - struct memblock_region *reg; + struct zcore_memmap_info *info; + size_t count =3D 0; char *buf; - int i =3D 0; =20 - buf =3D kcalloc(memblock.memory.cnt, CHUNK_INFO_SIZE, GFP_KERNEL); + walk_system_ram_res(0, ULONG_MAX, &count, zcore_count_ram_resource); + + info =3D kmalloc(sizeof(*info), GFP_KERNEL); + if (!info) + return -ENOMEM; + buf =3D kcalloc(count, CHUNK_INFO_SIZE, GFP_KERNEL); if (!buf) { + kfree(info); return -ENOMEM; } - for_each_memblock(memory, reg) { - sprintf(buf + (i++ * CHUNK_INFO_SIZE), "%016llx %016llx ", - (unsigned long long) reg->base, - (unsigned long long) reg->size); - } - filp->private_data =3D buf; + info->length =3D count * CHUNK_INFO_SIZE; + info->buf =3D buf; + + walk_system_ram_res(0, ULONG_MAX, &buf, zcore_process_ram_resource); + + filp->private_data =3D info; return nonseekable_open(inode, filp); } =20 static int zcore_memmap_release(struct inode *inode, struct file *filp) { - kfree(filp->private_data); + struct zcore_memmap_info *info =3D filp->private_data; + + kfree(info->buf); + kfree(info); return 0; } =20 --=20 2.25.1