From nobody Sat Apr 18 04:18:56 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 67095C433EF for ; Mon, 18 Jul 2022 13:42:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234580AbiGRNmC (ORCPT ); Mon, 18 Jul 2022 09:42:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36140 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234435AbiGRNl6 (ORCPT ); Mon, 18 Jul 2022 09:41:58 -0400 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 474601DA42; Mon, 18 Jul 2022 06:41:57 -0700 (PDT) Received: from pps.filterd (m0098417.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26IDblG7003341; Mon, 18 Jul 2022 13:41:50 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=8H7WOwXqw+3wr9CerSM2hWVM0N01TwTjsRnLxOLOLV8=; b=D7rAJh3DRL9rhEbOLrKQgqp1jKGZSvtFuG97P0igZmA2zgGJBsG5dedA9ZCNz5FFpZvj AiPgVezEz1g143J3l3SJExi4xFGSzyQexlQcD7IkZv9B7/51DBtp+DY8FiRF7nYtO28u 3PkAm7Ogye2mclFU2raLTgv1SnjQT9pWJn3m/Hs6wzniZSuF+av8dPin4kze0gNqCx4Q D7sLf+RD0G5o9gkvkEO7/NUj3ujs8e1pCoekjUkOEGoe0A8XLDeDuvUqz6yInrawwifD WgiYDjqZPhgvwvu3JsS5C2DfedPQIFuY1oxsWsidRYN2+Vi1dSqWeSe3tjC5Sj946nS/ Vw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3hd8cnre3t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Jul 2022 13:41:49 +0000 Received: from m0098417.ppops.net (m0098417.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 26IDcDmX007785; Mon, 18 Jul 2022 13:41:39 GMT Received: from ppma05fra.de.ibm.com (6c.4a.5195.ip4.static.sl-reverse.com [149.81.74.108]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3hd8cnrdg1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Jul 2022 13:41:38 +0000 Received: from pps.filterd (ppma05fra.de.ibm.com [127.0.0.1]) by ppma05fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 26IDLCxX018737; Mon, 18 Jul 2022 13:41:26 GMT Received: from b06avi18878370.portsmouth.uk.ibm.com (b06avi18878370.portsmouth.uk.ibm.com [9.149.26.194]) by ppma05fra.de.ibm.com with ESMTP id 3hbmy8t1fx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Jul 2022 13:41:26 +0000 Received: from d06av22.portsmouth.uk.ibm.com (d06av22.portsmouth.uk.ibm.com [9.149.105.58]) by b06avi18878370.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 26IDfZZL31326584 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 18 Jul 2022 13:41:35 GMT Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9B5E44C04A; Mon, 18 Jul 2022 13:41:23 +0000 (GMT) Received: from d06av22.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 892F34C046; Mon, 18 Jul 2022 13:41:23 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by d06av22.portsmouth.uk.ibm.com (Postfix) with ESMTP; Mon, 18 Jul 2022 13:41:23 +0000 (GMT) Received: by tuxmaker.boeblingen.de.ibm.com (Postfix, from userid 55669) id 6F8FBE020A; Mon, 18 Jul 2022 15:32:41 +0200 (CEST) From: Alexander Gordeev To: Matthew Wilcox , Alexander Egorenkov , Heiko Carstens Cc: Baoquan He , Christoph Hellwig , Vasily Gorbik , Al Viro , linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH v3 1/3] s390/crash: move copy_to_user_real() to crash_dump.c Date: Mon, 18 Jul 2022 15:32:39 +0200 Message-Id: <274a7b18b253574d0aa9ef09d3a9a8e5330c0a83.1658148067.git.agordeev@linux.ibm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: vg82ghc6JwCVmzxg05GZpo39pQjQ8NJo X-Proofpoint-ORIG-GUID: C0nyLCSRPFDh8MYzYF2FFXK9auMoGslm X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-18_12,2022-07-18_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 lowpriorityscore=0 priorityscore=1501 suspectscore=0 phishscore=0 clxscore=1015 spamscore=0 mlxlogscore=704 adultscore=0 malwarescore=0 impostorscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207180058 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Function copy_to_user_real() does not really belong to maccess.c. It is only used for copying oldmem to user space, so let's move it to the friends. Signed-off-by: Alexander Gordeev --- arch/s390/include/asm/uaccess.h | 1 - arch/s390/kernel/crash_dump.c | 26 ++++++++++++++++++++++++++ arch/s390/mm/maccess.c | 26 -------------------------- 3 files changed, 26 insertions(+), 27 deletions(-) diff --git a/arch/s390/include/asm/uaccess.h b/arch/s390/include/asm/uacces= s.h index f4511e21d646..2a067315fe59 100644 --- a/arch/s390/include/asm/uaccess.h +++ b/arch/s390/include/asm/uaccess.h @@ -285,7 +285,6 @@ static inline unsigned long __must_check clear_user(voi= d __user *to, unsigned lo return __clear_user(to, n); } =20 -int copy_to_user_real(void __user *dest, unsigned long src, unsigned long = count); void *s390_kernel_write(void *dst, const void *src, size_t size); =20 int __noreturn __put_kernel_bad(void); diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c index 0efee5c49b1e..8d7332d4444c 100644 --- a/arch/s390/kernel/crash_dump.c +++ b/arch/s390/kernel/crash_dump.c @@ -173,6 +173,32 @@ int copy_oldmem_kernel(void *dst, unsigned long src, s= ize_t count) return 0; } =20 +/* + * Copy memory from kernel (real) to user (virtual) + */ +static int copy_to_user_real(void __user *dest, unsigned long src, unsigne= d long count) +{ + int offs =3D 0, size, rc; + char *buf; + + buf =3D (char *)__get_free_page(GFP_KERNEL); + if (!buf) + return -ENOMEM; + rc =3D -EFAULT; + while (offs < count) { + size =3D min(PAGE_SIZE, count - offs); + if (memcpy_real(buf, src + offs, size)) + goto out; + if (copy_to_user(dest + offs, buf, size)) + goto out; + offs +=3D size; + } + rc =3D 0; +out: + free_page((unsigned long)buf); + return rc; +} + /* * Copy memory of the old, dumped system to a user space virtual address */ diff --git a/arch/s390/mm/maccess.c b/arch/s390/mm/maccess.c index 421efa46946b..d6d84e02f35a 100644 --- a/arch/s390/mm/maccess.c +++ b/arch/s390/mm/maccess.c @@ -171,32 +171,6 @@ void memcpy_absolute(void *dest, void *src, size_t cou= nt) arch_local_irq_restore(flags); } =20 -/* - * Copy memory from kernel (real) to user (virtual) - */ -int copy_to_user_real(void __user *dest, unsigned long src, unsigned long = count) -{ - int offs =3D 0, size, rc; - char *buf; - - buf =3D (char *) __get_free_page(GFP_KERNEL); - if (!buf) - return -ENOMEM; - rc =3D -EFAULT; - while (offs < count) { - size =3D min(PAGE_SIZE, count - offs); - if (memcpy_real(buf, src + offs, size)) - goto out; - if (copy_to_user(dest + offs, buf, size)) - goto out; - offs +=3D size; - } - rc =3D 0; -out: - free_page((unsigned long) buf); - return rc; -} - /* * Check if physical address is within prefix or zero page */ --=20 2.34.1 From nobody Sat Apr 18 04:18:56 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6B5FECCA479 for ; Mon, 18 Jul 2022 13:42:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234689AbiGRNmK (ORCPT ); Mon, 18 Jul 2022 09:42:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234517AbiGRNmB (ORCPT ); Mon, 18 Jul 2022 09:42:01 -0400 Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 352C9205EF; Mon, 18 Jul 2022 06:42:00 -0700 (PDT) Received: from pps.filterd (m0098416.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26ID4Yqw010853; Mon, 18 Jul 2022 13:41:54 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=z3tJjdpL0+XtAbdTT02pUJH7mrIRQOS4RQYVy9mn/+I=; b=cTf7/sOlWyDN/lzV78asG0qmDk+n48znGE8sOBQbr6JLzn4G3WEBVY5rrMTp8o3MkSmi CSLck0DhMoSFo5/Yu1xe8x4w0oxFUHfXrP5QQSy+A/DiLPgTNLiFLbU3hKQgqaaZuwEK xnIdrOYLIXJrTarQ7OJlpMO4AhFb9BIbZ6X++BjJ1JBQ83FPQ+C5RkD5aeQzDZXnUhJV 2tOH1BrMERNzjy6QaUrW4ZmjfhkE83JpbQXlgKzEFjrB2DmsRq2HY6vo1jxJaTMQRZVn APSKC8Ucagv3pG+RLyANUSal58NgtoSlXmtbpGdHZU5OiU5jFcbFZUbhFyz+wjpR5TKW 3A== Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com (PPS) with ESMTPS id 3hd8371q7v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Jul 2022 13:41:52 +0000 Received: from m0098416.ppops.net (m0098416.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 26ID4oUg017721; Mon, 18 Jul 2022 13:41:43 GMT Received: from ppma04fra.de.ibm.com (6a.4a.5195.ip4.static.sl-reverse.com [149.81.74.106]) by mx0b-001b2d01.pphosted.com (PPS) with ESMTPS id 3hd8371pg6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Jul 2022 13:41:43 +0000 Received: from pps.filterd (ppma04fra.de.ibm.com [127.0.0.1]) by ppma04fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 26IDLXsV005080; Mon, 18 Jul 2022 13:41:27 GMT Received: from b06cxnps3074.portsmouth.uk.ibm.com (d06relay09.portsmouth.uk.ibm.com [9.149.109.194]) by ppma04fra.de.ibm.com with ESMTP id 3hbmy8j1ag-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Jul 2022 13:41:27 +0000 Received: from d06av24.portsmouth.uk.ibm.com (mk.ibm.com [9.149.105.60]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 26IDfNns16777598 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 18 Jul 2022 13:41:23 GMT Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9F8CC42041; Mon, 18 Jul 2022 13:41:23 +0000 (GMT) Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8B6C14203F; Mon, 18 Jul 2022 13:41:23 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by d06av24.portsmouth.uk.ibm.com (Postfix) with ESMTP; Mon, 18 Jul 2022 13:41:23 +0000 (GMT) Received: by tuxmaker.boeblingen.de.ibm.com (Postfix, from userid 55669) id 7293FE02A8; Mon, 18 Jul 2022 15:32:41 +0200 (CEST) From: Alexander Gordeev To: Matthew Wilcox , Alexander Egorenkov , Heiko Carstens Cc: Baoquan He , Christoph Hellwig , Vasily Gorbik , Al Viro , linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH v3 2/3] s390/crash: use static swap buffer for copy_to_user_real() Date: Mon, 18 Jul 2022 15:32:40 +0200 Message-Id: <77d50b4a2359d1791835b6111edaa155eb11c5ea.1658148067.git.agordeev@linux.ibm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: mnfQqe1d_wwsOKUeIcZD9zKGoEoT8pNW X-Proofpoint-GUID: KeznBNHQoCe01GpFto3CN86eUVD_w23B X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-18_12,2022-07-18_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 bulkscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 spamscore=0 mlxlogscore=999 phishscore=0 adultscore=0 priorityscore=1501 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207180058 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Currently a temporary page-size buffer is allocated for copying oldmem to user space. That limits copy_to_user_real() operation only to stages when virtual memory is available and still makes it possible to fail while the system is being dumped. Instead of reallocating single page on each copy_oldmem_page() iteration use a statically allocated buffer. This also paves the way for a further memcpy_real() rework where no swap buffer is needed altogether. Signed-off-by: Alexander Gordeev --- arch/s390/kernel/crash_dump.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c index 8d7332d4444c..fd9fe93e48b6 100644 --- a/arch/s390/kernel/crash_dump.c +++ b/arch/s390/kernel/crash_dump.c @@ -53,6 +53,7 @@ struct save_area { }; =20 static LIST_HEAD(dump_save_areas); +static char memcpy_real_buf[PAGE_SIZE]; =20 /* * Allocate a save area @@ -179,23 +180,18 @@ int copy_oldmem_kernel(void *dst, unsigned long src, = size_t count) static int copy_to_user_real(void __user *dest, unsigned long src, unsigne= d long count) { int offs =3D 0, size, rc; - char *buf; =20 - buf =3D (char *)__get_free_page(GFP_KERNEL); - if (!buf) - return -ENOMEM; rc =3D -EFAULT; while (offs < count) { size =3D min(PAGE_SIZE, count - offs); - if (memcpy_real(buf, src + offs, size)) + if (memcpy_real(memcpy_real_buf, src + offs, size)) goto out; - if (copy_to_user(dest + offs, buf, size)) + if (copy_to_user(dest + offs, memcpy_real_buf, size)) goto out; offs +=3D size; } rc =3D 0; out: - free_page((unsigned long)buf); return rc; } =20 --=20 2.34.1 From nobody Sat Apr 18 04:18:56 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C7D96C433EF for ; Mon, 18 Jul 2022 13:42:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234846AbiGRNmR (ORCPT ); Mon, 18 Jul 2022 09:42:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36338 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234637AbiGRNmI (ORCPT ); Mon, 18 Jul 2022 09:42:08 -0400 Received: from mx0a-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7AC3E20F43; Mon, 18 Jul 2022 06:42:07 -0700 (PDT) Received: from pps.filterd (m0098416.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.17.1.5/8.17.1.5) with ESMTP id 26ID4VHf010746; Mon, 18 Jul 2022 13:41:47 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=pp1; bh=Vs7SARRqKX7Yo7o1jX2FoNKWAfWUmz5pF9dOa7P+Mls=; b=YeQwYczYqk22zYDvsRSbdBwW+VbZSXdYW0VMTTj6BvFymkZn7Ru5b/op8F2DBh6L9e2X sS0wODb7EJ5D3RR/TIXBOOx6tHIRa6klfvmQ73p9P1vtleRZdIE2OSAVM3oaHCeG29DH xiMQ4dX9OrCgS/5e/z1GQLizsKqeCt7We/wKj0/BF9dXb3xGQV7iC+Fu1RxjZk5xrGF2 Omc6n2NX7IlNeREyidUSeFf2EXtwC4FEK/0ivS+cyaPB6nu/cxP0DeQniyfHOoK9AUk4 sHv6HAewhCB1EBF+YSx3bHXuBCGglcMYFj9hTCxfa80S41jZqa1WRpa5HSdCuIXlPzns fg== Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com (PPS) with ESMTPS id 3hd8371pyr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Jul 2022 13:41:45 +0000 Received: from m0098416.ppops.net (m0098416.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 26ID4WkP010778; Mon, 18 Jul 2022 13:41:36 GMT Received: from ppma03ams.nl.ibm.com (62.31.33a9.ip4.static.sl-reverse.com [169.51.49.98]) by mx0b-001b2d01.pphosted.com (PPS) with ESMTPS id 3hd8371pf9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Jul 2022 13:41:36 +0000 Received: from pps.filterd (ppma03ams.nl.ibm.com [127.0.0.1]) by ppma03ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 26IDKdMF016039; Mon, 18 Jul 2022 13:41:26 GMT Received: from b06avi18626390.portsmouth.uk.ibm.com (b06avi18626390.portsmouth.uk.ibm.com [9.149.26.192]) by ppma03ams.nl.ibm.com with ESMTP id 3hbmy8tmnr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 18 Jul 2022 13:41:26 +0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 26IDdfMv23855524 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 18 Jul 2022 13:39:41 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9B4ACAE057; Mon, 18 Jul 2022 13:41:23 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 888D1AE056; Mon, 18 Jul 2022 13:41:23 +0000 (GMT) Received: from tuxmaker.boeblingen.de.ibm.com (unknown [9.152.85.9]) by d06av26.portsmouth.uk.ibm.com (Postfix) with ESMTP; Mon, 18 Jul 2022 13:41:23 +0000 (GMT) Received: by tuxmaker.boeblingen.de.ibm.com (Postfix, from userid 55669) id 7556FE02E3; Mon, 18 Jul 2022 15:32:41 +0200 (CEST) From: Alexander Gordeev To: Matthew Wilcox , Alexander Egorenkov , Heiko Carstens Cc: Baoquan He , Christoph Hellwig , Vasily Gorbik , Al Viro , linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org Subject: [PATCH v3 3/3] s390/crash: support multi-segment iterators Date: Mon, 18 Jul 2022 15:32:41 +0200 Message-Id: <3d88ab5f5b02c53555a4a202648424ec9997fd6b.1658148067.git.agordeev@linux.ibm.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: CnNjMFIF6B-XcvrJGiOXxa2aNjlmZWxF X-Proofpoint-GUID: 7q4b-kqha2-3yDsvpDjbVMgEj_20m31n X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.883,Hydra:6.0.517,FMLib:17.11.122.1 definitions=2022-07-18_12,2022-07-18_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 suspectscore=0 bulkscore=0 clxscore=1011 lowpriorityscore=0 impostorscore=0 spamscore=0 mlxlogscore=999 phishscore=0 adultscore=0 priorityscore=1501 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2206140000 definitions=main-2207180058 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Make it possible to handle not only single-, but also multi- segment iterators in copy_oldmem_iter() callback. Change the semantics of called functions to match the iterator model - instead of an error code the exact number of bytes copied is returned. The swap page used to copy data to user space is adopted for kernel space too. That does not bring any performance impact. Suggested-by: Matthew Wilcox Fixes: 49b11524d648 ("s390/crash: add missing iterator advance in copy_oldm= em_page()") Signed-off-by: Alexander Gordeev --- arch/s390/include/asm/os_info.h | 17 ++++- arch/s390/include/asm/sclp.h | 4 +- arch/s390/kernel/crash_dump.c | 131 ++++++-------------------------- drivers/s390/char/zcore.c | 59 ++++++-------- 4 files changed, 64 insertions(+), 147 deletions(-) diff --git a/arch/s390/include/asm/os_info.h b/arch/s390/include/asm/os_inf= o.h index 147a8d547ef9..85248d8fee0c 100644 --- a/arch/s390/include/asm/os_info.h +++ b/arch/s390/include/asm/os_info.h @@ -8,6 +8,8 @@ #ifndef _ASM_S390_OS_INFO_H #define _ASM_S390_OS_INFO_H =20 +#include + #define OS_INFO_VERSION_MAJOR 1 #define OS_INFO_VERSION_MINOR 1 #define OS_INFO_MAGIC 0x4f53494e464f535aULL /* OSINFOSZ */ @@ -39,7 +41,20 @@ u32 os_info_csum(struct os_info *os_info); =20 #ifdef CONFIG_CRASH_DUMP void *os_info_old_entry(int nr, unsigned long *size); -int copy_oldmem_kernel(void *dst, unsigned long src, size_t count); +size_t copy_oldmem_iter(struct iov_iter *iter, unsigned long src, size_t c= ount); + +static inline int copy_oldmem_kernel(void *dst, unsigned long src, size_t = count) +{ + struct iov_iter iter; + struct kvec kvec; + + kvec.iov_base =3D dst; + kvec.iov_len =3D count; + iov_iter_kvec(&iter, WRITE, &kvec, 1, count); + if (copy_oldmem_iter(&iter, src, count) < count) + return -EFAULT; + return 0; +} #else static inline void *os_info_old_entry(int nr, unsigned long *size) { diff --git a/arch/s390/include/asm/sclp.h b/arch/s390/include/asm/sclp.h index addefe8ccdba..9d4c7f71e070 100644 --- a/arch/s390/include/asm/sclp.h +++ b/arch/s390/include/asm/sclp.h @@ -17,6 +17,7 @@ #define EXT_SCCB_READ_CPU (3 * PAGE_SIZE) =20 #ifndef __ASSEMBLY__ +#include #include #include =20 @@ -146,8 +147,7 @@ int sclp_pci_deconfigure(u32 fid); int sclp_ap_configure(u32 apid); int sclp_ap_deconfigure(u32 apid); int sclp_pci_report(struct zpci_report_error_header *report, u32 fh, u32 f= id); -int memcpy_hsa_kernel(void *dest, unsigned long src, size_t count); -int memcpy_hsa_user(void __user *dest, unsigned long src, size_t count); +size_t memcpy_hsa_iter(struct iov_iter *iter, unsigned long src, size_t co= unt); void sclp_ocf_cpc_name_copy(char *dst); =20 static inline int sclp_get_core_info(struct sclp_core_info *info, int earl= y) diff --git a/arch/s390/kernel/crash_dump.c b/arch/s390/kernel/crash_dump.c index fd9fe93e48b6..8f918441a9de 100644 --- a/arch/s390/kernel/crash_dump.c +++ b/arch/s390/kernel/crash_dump.c @@ -115,101 +115,33 @@ void __init save_area_add_vxrs(struct save_area *sa,= __vector128 *vxrs) memcpy(sa->vxrs_high, vxrs + 16, 16 * sizeof(__vector128)); } =20 -/* - * Return physical address for virtual address - */ -static inline void *load_real_addr(void *addr) -{ - unsigned long real_addr; - - asm volatile( - " lra %0,0(%1)\n" - " jz 0f\n" - " la %0,0\n" - "0:" - : "=3Da" (real_addr) : "a" (addr) : "cc"); - return (void *)real_addr; -} - -/* - * Copy memory of the old, dumped system to a kernel space virtual address - */ -int copy_oldmem_kernel(void *dst, unsigned long src, size_t count) +static size_t copy_to_iter_real(struct iov_iter *iter, unsigned long src, = size_t count) { - unsigned long len; - void *ra; - int rc; + size_t len, copied, res =3D 0; =20 while (count) { - if (!oldmem_data.start && src < sclp.hsa_size) { - /* Copy from zfcp/nvme dump HSA area */ - len =3D min(count, sclp.hsa_size - src); - rc =3D memcpy_hsa_kernel(dst, src, len); - if (rc) - return rc; - } else { - /* Check for swapped kdump oldmem areas */ - if (oldmem_data.start && src - oldmem_data.start < oldmem_data.size) { - src -=3D oldmem_data.start; - len =3D min(count, oldmem_data.size - src); - } else if (oldmem_data.start && src < oldmem_data.size) { - len =3D min(count, oldmem_data.size - src); - src +=3D oldmem_data.start; - } else { - len =3D count; - } - if (is_vmalloc_or_module_addr(dst)) { - ra =3D load_real_addr(dst); - len =3D min(PAGE_SIZE - offset_in_page(ra), len); - } else { - ra =3D dst; - } - if (memcpy_real(ra, src, len)) - return -EFAULT; - } - dst +=3D len; - src +=3D len; - count -=3D len; - } - return 0; -} - -/* - * Copy memory from kernel (real) to user (virtual) - */ -static int copy_to_user_real(void __user *dest, unsigned long src, unsigne= d long count) -{ - int offs =3D 0, size, rc; - - rc =3D -EFAULT; - while (offs < count) { - size =3D min(PAGE_SIZE, count - offs); - if (memcpy_real(memcpy_real_buf, src + offs, size)) - goto out; - if (copy_to_user(dest + offs, memcpy_real_buf, size)) - goto out; - offs +=3D size; + len =3D min(PAGE_SIZE, count); + if (memcpy_real(memcpy_real_buf, src, len)) + break; + copied =3D copy_to_iter(memcpy_real_buf, len, iter); + count -=3D copied; + src +=3D copied; + res +=3D copied; + if (copied < len) + break; } - rc =3D 0; -out: - return rc; + return res; } =20 -/* - * Copy memory of the old, dumped system to a user space virtual address - */ -static int copy_oldmem_user(void __user *dst, unsigned long src, size_t co= unt) +size_t copy_oldmem_iter(struct iov_iter *iter, unsigned long src, size_t c= ount) { - unsigned long len; - int rc; + size_t len, copied, res =3D 0; =20 while (count) { if (!oldmem_data.start && src < sclp.hsa_size) { /* Copy from zfcp/nvme dump HSA area */ len =3D min(count, sclp.hsa_size - src); - rc =3D memcpy_hsa_user(dst, src, len); - if (rc) - return rc; + copied =3D memcpy_hsa_iter(iter, src, len); } else { /* Check for swapped kdump oldmem areas */ if (oldmem_data.start && src - oldmem_data.start < oldmem_data.size) { @@ -221,15 +153,15 @@ static int copy_oldmem_user(void __user *dst, unsigne= d long src, size_t count) } else { len =3D count; } - rc =3D copy_to_user_real(dst, src, len); - if (rc) - return rc; + copied =3D copy_to_iter_real(iter, src, len); } - dst +=3D len; - src +=3D len; - count -=3D len; + count -=3D copied; + src +=3D copied; + res +=3D copied; + if (copied < len) + break; } - return 0; + return res; } =20 /* @@ -239,26 +171,9 @@ ssize_t copy_oldmem_page(struct iov_iter *iter, unsign= ed long pfn, size_t csize, unsigned long offset) { unsigned long src; - int rc; =20 - if (!(iter_is_iovec(iter) || iov_iter_is_kvec(iter))) - return -EINVAL; - /* Multi-segment iterators are not supported */ - if (iter->nr_segs > 1) - return -EINVAL; - if (!csize) - return 0; src =3D pfn_to_phys(pfn) + offset; - - /* XXX: pass the iov_iter down to a common function */ - if (iter_is_iovec(iter)) - rc =3D copy_oldmem_user(iter->iov->iov_base, src, csize); - else - rc =3D copy_oldmem_kernel(iter->kvec->iov_base, src, csize); - if (rc < 0) - return rc; - iov_iter_advance(iter, csize); - return csize; + return copy_oldmem_iter(iter, src, csize); } =20 /* diff --git a/drivers/s390/char/zcore.c b/drivers/s390/char/zcore.c index 516783ba950f..3846bf892b2f 100644 --- a/drivers/s390/char/zcore.c +++ b/drivers/s390/char/zcore.c @@ -17,6 +17,7 @@ #include #include #include +#include =20 #include #include @@ -53,61 +54,47 @@ static struct ipl_parameter_block *zcore_ipl_block; static char hsa_buf[PAGE_SIZE] __aligned(PAGE_SIZE); =20 /* - * Copy memory from HSA to user memory (not reentrant): + * Copy memory from HSA to iterator (not reentrant): * - * @dest: User buffer where memory should be copied to + * @iter: Iterator where memory should be copied to * @src: Start address within HSA where data should be copied * @count: Size of buffer, which should be copied */ -int memcpy_hsa_user(void __user *dest, unsigned long src, size_t count) +size_t memcpy_hsa_iter(struct iov_iter *iter, unsigned long src, size_t co= unt) { - unsigned long offset, bytes; + size_t bytes, copied, res =3D 0; + unsigned long offset; =20 if (!hsa_available) - return -ENODATA; + return 0; =20 while (count) { if (sclp_sdias_copy(hsa_buf, src / PAGE_SIZE + 2, 1)) { TRACE("sclp_sdias_copy() failed\n"); - return -EIO; + break; } offset =3D src % PAGE_SIZE; bytes =3D min(PAGE_SIZE - offset, count); - if (copy_to_user(dest, hsa_buf + offset, bytes)) - return -EFAULT; - src +=3D bytes; - dest +=3D bytes; - count -=3D bytes; + copied =3D copy_to_iter(hsa_buf + offset, bytes, iter); + count -=3D copied; + src +=3D copied; + res +=3D copied; + if (copied < bytes) + break; } - return 0; + return res; } =20 -/* - * Copy memory from HSA to kernel memory (not reentrant): - * - * @dest: Kernel or user buffer where memory should be copied to - * @src: Start address within HSA where data should be copied - * @count: Size of buffer, which should be copied - */ -int memcpy_hsa_kernel(void *dest, unsigned long src, size_t count) +static inline int memcpy_hsa_kernel(void *dst, unsigned long src, size_t c= ount) { - unsigned long offset, bytes; + struct iov_iter iter; + struct kvec kvec; =20 - if (!hsa_available) - return -ENODATA; - - while (count) { - if (sclp_sdias_copy(hsa_buf, src / PAGE_SIZE + 2, 1)) { - TRACE("sclp_sdias_copy() failed\n"); - return -EIO; - } - offset =3D src % PAGE_SIZE; - bytes =3D min(PAGE_SIZE - offset, count); - memcpy(dest, hsa_buf + offset, bytes); - src +=3D bytes; - dest +=3D bytes; - count -=3D bytes; - } + kvec.iov_base =3D dst; + kvec.iov_len =3D count; + iov_iter_kvec(&iter, WRITE, &kvec, 1, count); + if (memcpy_hsa_iter(&iter, src, count) < count) + return -EIO; return 0; } =20 --=20 2.34.1