From patchwork Mon May 4 15:02:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526503 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 3801F14C0 for ; Mon, 4 May 2020 15:06:22 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id EF2C2206D7 for ; Mon, 4 May 2020 15:06:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="yORRV0oY" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EF2C2206D7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id F06288E0043; Mon, 4 May 2020 11:06:20 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id E8F268E0024; Mon, 4 May 2020 11:06:20 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D320B8E0043; Mon, 4 May 2020 11:06:20 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0020.hostedemail.com [216.40.44.20]) by kanga.kvack.org (Postfix) with ESMTP id B7D7B8E0024 for ; Mon, 4 May 2020 11:06:20 -0400 (EDT) Received: from smtpin28.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 880791924B for ; Mon, 4 May 2020 15:06:20 +0000 (UTC) X-FDA: 76779362520.28.women49_71859f928ee0f X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30003:30051:30054:30056:30064,0,RBL:141.146.126.78:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:22,LUA_SUMMARY:none X-HE-Tag: women49_71859f928ee0f X-Filterd-Recvd-Size: 5397 Received: from aserp2120.oracle.com (aserp2120.oracle.com [141.146.126.78]) by imf08.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:06:19 +0000 (UTC) Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044EnCJ6024811; Mon, 4 May 2020 15:06:11 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=3HTd6a/kkIIAOtF/XlS6dHGOCc3Mh+Pqrk2elGvT+Tk=; b=yORRV0oYlMSn935vfd2pC0Z1Mje0vWHKOJTjBC+EdVNPPXcRUdvCTawt3JP3GLhN3AHD Hhmmq3uWs8uyfU6Tl5w0IjP3dFNBiEdb473+e+A3mrZe7rLvhq3nHkafYB4tva+QiW8H WW6CRNuPimlGg0q6umF/F+doaFLznl0HOHh2DxJCd709f8blfHqFybRqxw1vBqw1lOzx ywZeB3+RCe81OTiB64xQzp4t7BuoitQODBsmBgbONYSN47tXHUjfaqtHdkz1AD/cysDx mlfIwhpbtZ07FuagtA4OgI/3pHMaVeV7cLUfMm+IJgRkGnZv3RzTz9/+6hc6JBUhzO+y pg== Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by aserp2120.oracle.com with ESMTP id 30s0tm7f5y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:06:11 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044ElaHf053343; Mon, 4 May 2020 15:04:10 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userp3030.oracle.com with ESMTP id 30t1r2f5ph-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:10 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 044F49Ml028395; Mon, 4 May 2020 15:04:09 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:08 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 01/14] mm/asi: Define the test ASI type Date: Mon, 4 May 2020 17:02:22 +0200 Message-Id: <20200504150235.12171-2-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 adultscore=0 suspectscore=0 spamscore=0 mlxlogscore=999 malwarescore=0 phishscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 mlxscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 phishscore=0 clxscore=1015 bulkscore=0 mlxlogscore=999 adultscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Define the test ASI type which can be used for testing or experimenting ASI. Signed-off-by: Alexandre Chartre --- arch/x86/include/asm/asi.h | 2 ++ arch/x86/mm/asi.c | 1 + drivers/staging/Makefile | 1 + 3 files changed, 4 insertions(+) diff --git a/arch/x86/include/asm/asi.h b/arch/x86/include/asm/asi.h index eafed750e07f..de4f790c630b 100644 --- a/arch/x86/include/asm/asi.h +++ b/arch/x86/include/asm/asi.h @@ -66,6 +66,7 @@ struct asi_tlb_state { #ifdef CONFIG_PAGE_TABLE_ISOLATION #define ASI_PCID_PREFIX_USER 0x80 /* user ASI */ #endif +#define ASI_PCID_PREFIX_TEST 0xff /* test ASI */ struct asi_type { int pcid_prefix; /* PCID prefix */ @@ -156,6 +157,7 @@ extern int asi_init_dpt(struct dpt *dpt); #ifdef CONFIG_PAGE_TABLE_ISOLATION DECLARE_ASI_TYPE(user); #endif +DECLARE_ASI_TYPE(test); static inline void asi_set_log_policy(struct asi *asi, int policy) { diff --git a/arch/x86/mm/asi.c b/arch/x86/mm/asi.c index 8b670ed13729..e0b0d70415d7 100644 --- a/arch/x86/mm/asi.c +++ b/arch/x86/mm/asi.c @@ -17,6 +17,7 @@ #ifdef CONFIG_PAGE_TABLE_ISOLATION DEFINE_ASI_TYPE(user, ASI_PCID_PREFIX_USER, false); #endif +DEFINE_ASI_TYPE(test, ASI_PCID_PREFIX_TEST, true); static void asi_log_fault(struct asi *asi, struct pt_regs *regs, unsigned long error_code, unsigned long address, diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 4d34198151b3..fb50e669579b 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -50,3 +50,4 @@ obj-$(CONFIG_FIELDBUS_DEV) += fieldbus/ obj-$(CONFIG_KPC2000) += kpc2000/ obj-$(CONFIG_QLGE) += qlge/ obj-$(CONFIG_WFX) += wfx/ +obj-$(CONFIG_ADDRESS_SPACE_ISOLATION) += asi/ From patchwork Mon May 4 15:02:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526483 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 CBDCE1392 for ; Mon, 4 May 2020 15:04:27 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 8AA3D20721 for ; Mon, 4 May 2020 15:04:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="FTt900j8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8AA3D20721 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id AE7C58E0039; Mon, 4 May 2020 11:04:26 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id A99608E0024; Mon, 4 May 2020 11:04:26 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9AE918E0039; Mon, 4 May 2020 11:04:26 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0231.hostedemail.com [216.40.44.231]) by kanga.kvack.org (Postfix) with ESMTP id 827DE8E0024 for ; Mon, 4 May 2020 11:04:26 -0400 (EDT) Received: from smtpin15.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 4104818F40 for ; Mon, 4 May 2020 15:04:26 +0000 (UTC) X-FDA: 76779357732.15.dogs21_60e43ce94a22a X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT,0,RBL:156.151.31.86:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:23,LUA_SUMMARY:none X-HE-Tag: dogs21_60e43ce94a22a X-Filterd-Recvd-Size: 7411 Received: from userp2130.oracle.com (userp2130.oracle.com [156.151.31.86]) by imf47.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:04:25 +0000 (UTC) Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044ElfaX116691; Mon, 4 May 2020 15:04:15 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=9ZTqvJjjLyxOtbSJqAkDSETOKDWWKvJ7dBdIIE9LUGI=; b=FTt900j8w4nSYYb8kx7FGWna/5R7g+FIVCzUgqKfgT/XXDX9lMqzsYFuXOMaWatWCgBZ hDnIB9nuFQYpeYqVbwQXMrb2NjLzMgK6sMnbW0G0pscgfYjszfp2gN3g8q5Kb/Beo48r aDjq7Gq53nAw4Ndvbdef7LM9lMI4myGgTwkpeODx06op+/yW25dLZC8r6yNbeYX7iNj7 G3VejSC7IIwkMlKxmy6ue1UUTNGKTT+9JbeOY2akQHTpe2FtScu9gw4uBEncVhBlW7Tk jIFwbQuh+oDRTgZ8ZRqh/NUKSItafILU06RbLIDSL/oU+BbQ5iobRGSU1I9v4JK4i0GQ Qw== Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by userp2130.oracle.com with ESMTP id 30s09qygt2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:15 +0000 Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044EmVKi105667; Mon, 4 May 2020 15:04:14 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userp3020.oracle.com with ESMTP id 30sjjw15mf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:14 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 044F4CLS028449; Mon, 4 May 2020 15:04:12 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:12 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 02/14] asidrv: Introduce the ASI driver Date: Mon, 4 May 2020 17:02:23 +0200 Message-Id: <20200504150235.12171-3-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxscore=0 phishscore=0 bulkscore=0 malwarescore=0 spamscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 lowpriorityscore=0 spamscore=0 adultscore=0 clxscore=1015 suspectscore=0 priorityscore=1501 malwarescore=0 mlxlogscore=999 phishscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Introduce the infrastructure for the ASI driver. This driver is meant for testing ASI. It creates a test ASI, and will allow to run some test sequences on this ASI. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/Makefile | 7 ++ drivers/staging/asi/asidrv.c | 129 +++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 drivers/staging/asi/Makefile create mode 100644 drivers/staging/asi/asidrv.c diff --git a/drivers/staging/asi/Makefile b/drivers/staging/asi/Makefile new file mode 100644 index 000000000000..a48487e48d7c --- /dev/null +++ b/drivers/staging/asi/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0 + +# +# Address Space Isolation (ASI) driver +# +obj-m += asi.o +asi-y := asidrv.o diff --git a/drivers/staging/asi/asidrv.c b/drivers/staging/asi/asidrv.c new file mode 100644 index 000000000000..c06e4734e0e5 --- /dev/null +++ b/drivers/staging/asi/asidrv.c @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2020, Oracle and/or its affiliates. + */ + +#include +#include +#include +#include + +#include +#include + +struct asidrv_test { + struct asi *asi; /* ASI for testing */ + struct dpt *dpt; /* ASI decorated page-table */ +}; + +static struct asidrv_test *asidrv_test; + +static void asidrv_test_destroy(struct asidrv_test *test); + +static struct asidrv_test *asidrv_test_create(void) +{ + struct asidrv_test *test; + int err; + + test = kzalloc(sizeof(*test), GFP_KERNEL); + if (!test) + return NULL; + + /* + * Create and fill a decorator page-table to be used with the ASI. + */ + test->dpt = dpt_create(ASI_PGTABLE_MASK); + if (!test->dpt) + goto error; + + err = asi_init_dpt(test->dpt); + if (err) + goto error; + + err = DPT_MAP_THIS_MODULE(test->dpt); + if (err) + goto error; + + /* map the asidrv_test as we will access it during the test */ + err = dpt_map(test->dpt, test, sizeof(*test)); + if (err) + goto error; + + test->asi = asi_create_test(); + if (!test->asi) + goto error; + + /* + * By default, the ASI structure is not mapped into the ASI. We + * map it so that we can access it and verify the consistency + * of some values (for example the CR3 value). + */ + err = dpt_map(test->dpt, test->asi, sizeof(*test->asi)); + if (err) + goto error; + + asi_set_pagetable(test->asi, test->dpt->pagetable); + + return test; + +error: + pr_debug("Failed to create ASI Test\n"); + asidrv_test_destroy(test); + return NULL; +} + +static void asidrv_test_destroy(struct asidrv_test *test) +{ + if (!test) + return; + + if (test->dpt) + dpt_destroy(test->dpt); + + if (test->asi) + asi_destroy(test->asi); + + kfree(test); +} + +static const struct file_operations asidrv_fops = { + .owner = THIS_MODULE, +}; + +static struct miscdevice asidrv_miscdev = { + .minor = MISC_DYNAMIC_MINOR, + .name = KBUILD_MODNAME, + .fops = &asidrv_fops, +}; + +static int __init asidrv_init(void) +{ + int err; + + asidrv_test = asidrv_test_create(); + if (!asidrv_test) + return -ENOMEM; + + err = misc_register(&asidrv_miscdev); + if (err) { + asidrv_test_destroy(asidrv_test); + asidrv_test = NULL; + } + + return err; +} + +static void __exit asidrv_exit(void) +{ + asidrv_test_destroy(asidrv_test); + asidrv_test = NULL; + misc_deregister(&asidrv_miscdev); +} + +module_init(asidrv_init); +module_exit(asidrv_exit); + +MODULE_AUTHOR("Alexandre Chartre "); +MODULE_DESCRIPTION("Privileged interface to ASI"); +MODULE_VERSION("1.0"); +MODULE_LICENSE("GPL v2"); From patchwork Mon May 4 15:02:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526485 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 60A5C1392 for ; Mon, 4 May 2020 15:04:33 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 1206120721 for ; Mon, 4 May 2020 15:04:33 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="iLw7TQwZ" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1206120721 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id EE0408E003A; Mon, 4 May 2020 11:04:31 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id E90B98E0024; Mon, 4 May 2020 11:04:31 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DA6D48E003A; Mon, 4 May 2020 11:04:31 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0005.hostedemail.com [216.40.44.5]) by kanga.kvack.org (Postfix) with ESMTP id C34878E0024 for ; Mon, 4 May 2020 11:04:31 -0400 (EDT) Received: from smtpin14.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 8E2041AA6A for ; Mon, 4 May 2020 15:04:31 +0000 (UTC) X-FDA: 76779357942.14.suit81_61a73bc7e4058 X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30029:30034:30051:30054:30056:30064:30070,0,RBL:156.151.31.85:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:23,LUA_SUMMARY:none X-HE-Tag: suit81_61a73bc7e4058 X-Filterd-Recvd-Size: 12080 Received: from userp2120.oracle.com (userp2120.oracle.com [156.151.31.85]) by imf17.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:04:30 +0000 (UTC) Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044Elhbi024556; Mon, 4 May 2020 15:04:19 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=yN7fiCPis1NfHiTjMfGSvpjx0uW8eE+ETSwTj0Wh6UE=; b=iLw7TQwZOW2TBPjxo/Dr44GRZ5X4dP/0Tq1yFGXZ9GFgF2aQbrHti8D7zNo0NhaQwiuF md2F6KfoWASy3w3V1l4Ia6F+md4uaZR1Z4NjivazpdONUi5btxjtdApZ82yFcLMbiAFJ TpKq62WQoW8yDkqv7NhJW6/Wvde/OMTSNJSItn+qNq4+6LtKKoKYo50zy2nAQSXEtmgx LQnM82168dsVlRbKa1WM8tGhHQ/cEPJ/tRyXv14bh4QnFA/+uJFYMtbw+fLl3IFYBCBS N7S4/Khv4ToQGetmxLDvWfGfS8rTJ03yGv0IpeJX1CEBYp/ei6wzwvYCoIweocJ+twBV sg== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by userp2120.oracle.com with ESMTP id 30s1gmy9j7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:19 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044EkfBq094779; Mon, 4 May 2020 15:04:18 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserp3030.oracle.com with ESMTP id 30sjdqqnbq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:18 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 044F4Gmm028489; Mon, 4 May 2020 15:04:17 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:16 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 03/14] asidrv: Introduce the ASIDRV_IOCTL_RUN_SEQUENCE ioctl Date: Mon, 4 May 2020 17:02:24 +0200 Message-Id: <20200504150235.12171-4-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 suspectscore=0 mlxscore=0 bulkscore=0 adultscore=0 phishscore=0 mlxlogscore=999 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 suspectscore=0 mlxscore=0 spamscore=0 clxscore=1015 priorityscore=1501 bulkscore=0 phishscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: The ASIDRV_IOCTL_RUN_SEQUENCE ioctl runs a specified sequence with the test ASI. The ioctl returns whether the run was successful or not, and if the test ASI was active at the end of the run. For now, two test sequences are implemented: - ASIDRV_SEQ_NOP does nothing but enters and exits the test ASI; - ASIDRV_SEQ_PRINTK calls printk while running with ASI. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/asidrv.c | 248 +++++++++++++++++++++++++++++++++++ drivers/staging/asi/asidrv.h | 29 ++++ 2 files changed, 277 insertions(+) create mode 100644 drivers/staging/asi/asidrv.h diff --git a/drivers/staging/asi/asidrv.c b/drivers/staging/asi/asidrv.c index c06e4734e0e5..4f0548edb2f9 100644 --- a/drivers/staging/asi/asidrv.c +++ b/drivers/staging/asi/asidrv.c @@ -10,15 +10,28 @@ #include #include +#include + +#include "asidrv.h" struct asidrv_test { struct asi *asi; /* ASI for testing */ struct dpt *dpt; /* ASI decorated page-table */ }; +struct asidrv_sequence { + const char *name; + enum asidrv_run_error (*setup)(struct asidrv_test *t); + enum asidrv_run_error (*run)(struct asidrv_test *t); + void (*cleanup)(struct asidrv_test *t); +}; + static struct asidrv_test *asidrv_test; static void asidrv_test_destroy(struct asidrv_test *test); +static void asidrv_run_fini(struct asidrv_test *test); +static void asidrv_run_cleanup(struct asidrv_test *test, + struct asidrv_sequence *sequence); static struct asidrv_test *asidrv_test_create(void) { @@ -86,8 +99,243 @@ static void asidrv_test_destroy(struct asidrv_test *test) kfree(test); } +static int asidrv_asi_is_active(struct asi *asi) +{ + struct asi *current_asi; + unsigned long cr3; + bool is_active; + int idepth; + + if (!asi) + return false; + + current_asi = this_cpu_read(cpu_asi_session.asi); + if (current_asi == asi) { + idepth = this_cpu_read(cpu_asi_session.idepth); + is_active = (idepth == 0); + } else { + is_active = false; + if (current_asi) { + /* weird... another ASI is active! */ + pr_debug("ASI %px is active (testing ASI = %px)\n", + current_asi, asi); + } + } + + /* + * If the ASI is active check that the CR3 value is consistent with + * this ASI being active. Otherwise, check that CR3 value doesn't + * reference an ASI. + */ + cr3 = __native_read_cr3(); + if (is_active) { + if ((cr3 ^ asi->base_cr3) >> ASI_PCID_PREFIX_SHIFT == 0) + return true; + + pr_warn("ASI %px: active ASI has inconsistent CR3 value (cr3=%lx, ASI base=%lx)\n", + asi, cr3, asi->base_cr3); + + } else if (cr3 & ASI_PCID_PREFIX_MASK) { + pr_warn("ASI %px: inactive ASI has inconsistent CR3 value (cr3=%lx, ASI base=%lx)\n", + asi, cr3, asi->base_cr3); + } + + return false; +} + +/* + * Printk Test Sequence + */ +static enum asidrv_run_error asidrv_printk_run(struct asidrv_test *test) +{ + pr_notice("asidrv printk test...\n"); + return ASIDRV_RUN_ERR_NONE; +} + +struct asidrv_sequence asidrv_sequences[] = { + [ASIDRV_SEQ_NOP] = { + "nop", + NULL, NULL, NULL, + }, + [ASIDRV_SEQ_PRINTK] = { + "printk", + NULL, asidrv_printk_run, NULL, + }, +}; + +static enum asidrv_run_error asidrv_run_init(struct asidrv_test *test) +{ + int err; + + /* + * Map the current stack, we need it to enter ASI. + */ + err = dpt_map(test->dpt, current->stack, + PAGE_SIZE << THREAD_SIZE_ORDER); + if (err) { + asidrv_run_fini(test); + return ASIDRV_RUN_ERR_MAP_STACK; + } + + /* + * Map the current task, schedule() needs it. + */ + err = dpt_map(test->dpt, current, sizeof(struct task_struct)); + if (err) + return ASIDRV_RUN_ERR_MAP_TASK; + + /* + * The ASI page-table has been updated so bump the generation + * number to have the ASI TLB flushed. + */ + atomic64_inc(&test->asi->pgtable_gen); + + return ASIDRV_RUN_ERR_NONE; +} + +static void asidrv_run_fini(struct asidrv_test *test) +{ + dpt_unmap(test->dpt, current); + dpt_unmap(test->dpt, current->stack); +} + +static enum asidrv_run_error asidrv_run_setup(struct asidrv_test *test, + struct asidrv_sequence *sequence) +{ + int run_err = ASIDRV_RUN_ERR_NONE; + + if (sequence->setup) { + run_err = sequence->setup(test); + if (run_err) + goto failed; + } + + return ASIDRV_RUN_ERR_NONE; + +failed: + return run_err; +} + +static void asidrv_run_cleanup(struct asidrv_test *test, + struct asidrv_sequence *sequence) +{ + if (sequence->cleanup) + sequence->cleanup(test); +} + +/* + * Run the specified sequence with ASI. Report result back. + */ +static enum asidrv_run_error asidrv_run(struct asidrv_test *test, + enum asidrv_seqnum seqnum, + bool *asi_active) +{ + struct asidrv_sequence *sequence = &asidrv_sequences[seqnum]; + int run_err = ASIDRV_RUN_ERR_NONE; + int err = 0; + + if (seqnum >= ARRAY_SIZE(asidrv_sequences)) { + pr_debug("Undefined sequence %d\n", seqnum); + return ASIDRV_RUN_ERR_SEQUENCE; + } + + pr_debug("ASI running sequence %s\n", sequence->name); + + run_err = asidrv_run_setup(test, sequence); + if (run_err) + return run_err; + + err = asi_enter(test->asi); + if (err) { + run_err = ASIDRV_RUN_ERR_ENTER; + goto failed_noexit; + } + + if (!asidrv_asi_is_active(test->asi)) { + run_err = ASIDRV_RUN_ERR_ACTIVE; + goto failed; + } + + if (sequence->run) { + run_err = sequence->run(test); + if (run_err != ASIDRV_RUN_ERR_NONE) + goto failed; + } + + *asi_active = asidrv_asi_is_active(test->asi); + +failed: + asi_exit(test->asi); + +failed_noexit: + asidrv_run_cleanup(test, sequence); + + return run_err; +} + +static int asidrv_ioctl_run_sequence(struct asidrv_test *test, + unsigned long arg) +{ + struct asidrv_run_param __user *urparam; + struct asidrv_run_param rparam; + enum asidrv_run_error run_err; + enum asidrv_seqnum seqnum; + bool asi_active = false; + + urparam = (struct asidrv_run_param *)arg; + if (copy_from_user(&rparam, urparam, sizeof(rparam))) + return -EFAULT; + + seqnum = rparam.sequence; + + pr_debug("ASI sequence %d\n", seqnum); + + run_err = asidrv_run_init(test); + if (run_err) { + pr_debug("ASI run init error %d\n", run_err); + goto failed_nofini; + } + + run_err = asidrv_run(test, seqnum, &asi_active); + if (run_err) { + pr_debug("ASI run error %d\n", run_err); + } else { + pr_debug("ASI run okay, ASI is %s\n", + asi_active ? "active" : "inactive"); + } + + asidrv_run_fini(test); + +failed_nofini: + rparam.run_error = run_err; + rparam.asi_active = asi_active; + + if (copy_to_user(urparam, &rparam, sizeof(rparam))) + return -EFAULT; + + return 0; +} + +static long asidrv_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + struct asidrv_test *test = asidrv_test; + + switch (cmd) { + + /* Test ioctls */ + + case ASIDRV_IOCTL_RUN_SEQUENCE: + return asidrv_ioctl_run_sequence(test, arg); + + default: + return -ENOTTY; + }; +} + static const struct file_operations asidrv_fops = { .owner = THIS_MODULE, + .unlocked_ioctl = asidrv_ioctl, + .compat_ioctl = compat_ptr_ioctl, }; static struct miscdevice asidrv_miscdev = { diff --git a/drivers/staging/asi/asidrv.h b/drivers/staging/asi/asidrv.h new file mode 100644 index 000000000000..33acb058c443 --- /dev/null +++ b/drivers/staging/asi/asidrv.h @@ -0,0 +1,29 @@ +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ + +#ifndef __ASIDRV_H__ +#define __ASIDRV_H__ + +#include + +enum asidrv_seqnum { + ASIDRV_SEQ_NOP, /* empty sequence */ + ASIDRV_SEQ_PRINTK, /* printk sequence */ +}; + +enum asidrv_run_error { + ASIDRV_RUN_ERR_NONE, /* no error */ + ASIDRV_RUN_ERR_SEQUENCE, /* unknown sequence */ + ASIDRV_RUN_ERR_MAP_STACK, /* failed to map current stack */ + ASIDRV_RUN_ERR_MAP_TASK, /* failed to map current task */ + ASIDRV_RUN_ERR_ENTER, /* failed to enter ASI */ + ASIDRV_RUN_ERR_ACTIVE, /* ASI is not active after entering ASI */ +}; + +#define ASIDRV_IOCTL_RUN_SEQUENCE _IOWR('a', 1, struct asidrv_run_param) + +struct asidrv_run_param { + __u32 sequence; /* sequence to run */ + __u32 run_error; /* result error after run */ + __u32 asi_active; /* ASI is active after run? */ +}; +#endif From patchwork Mon May 4 15:02:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526505 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 C7CAC14C0 for ; Mon, 4 May 2020 15:06:34 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 862122087E for ; Mon, 4 May 2020 15:06:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="b3WfzdZM" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 862122087E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id A4B1F8E0044; Mon, 4 May 2020 11:06:33 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 9D4378E0024; Mon, 4 May 2020 11:06:33 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 89C478E0044; Mon, 4 May 2020 11:06:33 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0235.hostedemail.com [216.40.44.235]) by kanga.kvack.org (Postfix) with ESMTP id 6F7F68E0024 for ; Mon, 4 May 2020 11:06:33 -0400 (EDT) Received: from smtpin12.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 3D20C19B01 for ; Mon, 4 May 2020 15:06:33 +0000 (UTC) X-FDA: 76779363066.12.heart30_735fa5bf23563 X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30034:30054:30056:30064,0,RBL:141.146.126.78:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:24,LUA_SUMMARY:none X-HE-Tag: heart30_735fa5bf23563 X-Filterd-Recvd-Size: 7499 Received: from aserp2120.oracle.com (aserp2120.oracle.com [141.146.126.78]) by imf36.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:06:32 +0000 (UTC) Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044En9fS024718; Mon, 4 May 2020 15:06:23 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=GdpSgFkEZ+Ur+ACfjLTgXfvY2O4IFXjjIbm/9Da3I/U=; b=b3WfzdZMrbDnbmyd5xFgV2+BKRnWt5HgHioOzu3QHzViYK85ZAPRmsyfspWC8h6K4I0p KK8P43R8WJg+ECSwDg1e2Jggg8+Zph7kmTJQ9qLwLmMN0GBV2DpHDaZRsk9gFIxpqvjI YlD1HnMjYvQvyHkNZEtcnygNDw+Ni6GaSvIWwvW+OKxEdQCVJsJIluAjc4Qe2bWSUsEi 1BrhbiIQGpQt4bIGmnbc60+ravI29lRgjTA7U7B0YSDiY5EJX5ltLDsrw8gW5yhC33nC 7pGoBevJMsXbtID7LfM8j08e/aKEhzi3ql9IXOwZ96DBwPTLRM5ckNXdeoMUVLd39cag Mw== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by aserp2120.oracle.com with ESMTP id 30s0tm7f8a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:06:23 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044Ekfvq094713; Mon, 4 May 2020 15:04:23 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserp3030.oracle.com with ESMTP id 30sjdqqnra-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:23 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 044F4LKe025185; Mon, 4 May 2020 15:04:21 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:20 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 04/14] asidrv: Sequence to test ASI access to mapped/unmapped memory Date: Mon, 4 May 2020 17:02:25 +0200 Message-Id: <20200504150235.12171-5-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 suspectscore=0 mlxscore=0 bulkscore=0 adultscore=0 phishscore=0 mlxlogscore=999 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 mlxscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 phishscore=0 clxscore=1015 bulkscore=0 mlxlogscore=999 adultscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add a sequence to test if ASI exit or not when accessing a mapped or unmapped memory buffer. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/asidrv.c | 70 ++++++++++++++++++++++++++++++++++++ drivers/staging/asi/asidrv.h | 3 ++ 2 files changed, 73 insertions(+) diff --git a/drivers/staging/asi/asidrv.c b/drivers/staging/asi/asidrv.c index 4f0548edb2f9..4231b56db167 100644 --- a/drivers/staging/asi/asidrv.c +++ b/drivers/staging/asi/asidrv.c @@ -14,9 +14,21 @@ #include "asidrv.h" +#define ASIDRV_TEST_BUFFER_SIZE PAGE_SIZE + +/* Number of read for mem/memmap test sequence */ +#define ASIDRV_MEM_READ_COUNT 1000 + +enum asidrv_state { + ASIDRV_STATE_NONE, + ASIDRV_STATE_INTR_WAITING, + ASIDRV_STATE_INTR_RECEIVED, +}; + struct asidrv_test { struct asi *asi; /* ASI for testing */ struct dpt *dpt; /* ASI decorated page-table */ + char *buffer; /* buffer for testing */ }; struct asidrv_sequence { @@ -42,6 +54,10 @@ static struct asidrv_test *asidrv_test_create(void) if (!test) return NULL; + test->buffer = kzalloc(ASIDRV_TEST_BUFFER_SIZE, GFP_KERNEL); + if (!test->buffer) + goto error; + /* * Create and fill a decorator page-table to be used with the ASI. */ @@ -96,6 +112,7 @@ static void asidrv_test_destroy(struct asidrv_test *test) if (test->asi) asi_destroy(test->asi); + kfree(test->buffer); kfree(test); } @@ -143,6 +160,51 @@ static int asidrv_asi_is_active(struct asi *asi) return false; } +/* + * Memory Buffer Access Test Sequences + */ + +#define OPTNONE __attribute__((optimize(0))) + +static enum asidrv_run_error OPTNONE asidrv_mem_run(struct asidrv_test *test) +{ + char c; + int i, index; + + /* + * Do random reads in the test buffer, and return if the ASI + * becomes inactive. + */ + for (i = 0; i < ASIDRV_MEM_READ_COUNT; i++) { + index = get_cycles() % ASIDRV_TEST_BUFFER_SIZE; + c = test->buffer[index]; + if (!asidrv_asi_is_active(test->asi)) { + pr_warn("ASI inactive after reading byte %d at %d\n", + i + 1, index); + break; + } + } + + return ASIDRV_RUN_ERR_NONE; +} + +static enum asidrv_run_error asidrv_memmap_setup(struct asidrv_test *test) +{ + int err; + + pr_debug("mapping test buffer %px\n", test->buffer); + err = dpt_map(test->dpt, test->buffer, ASIDRV_TEST_BUFFER_SIZE); + if (err) + return ASIDRV_RUN_ERR_MAP_BUFFER; + + return ASIDRV_RUN_ERR_NONE; +} + +static void asidrv_memmap_cleanup(struct asidrv_test *test) +{ + dpt_unmap(test->dpt, test->buffer); +} + /* * Printk Test Sequence */ @@ -161,6 +223,14 @@ struct asidrv_sequence asidrv_sequences[] = { "printk", NULL, asidrv_printk_run, NULL, }, + [ASIDRV_SEQ_MEM] = { + "mem", + NULL, asidrv_mem_run, NULL, + }, + [ASIDRV_SEQ_MEMMAP] = { + "memmap", + asidrv_memmap_setup, asidrv_mem_run, asidrv_memmap_cleanup, + }, }; static enum asidrv_run_error asidrv_run_init(struct asidrv_test *test) diff --git a/drivers/staging/asi/asidrv.h b/drivers/staging/asi/asidrv.h index 33acb058c443..1e820cc64f13 100644 --- a/drivers/staging/asi/asidrv.h +++ b/drivers/staging/asi/asidrv.h @@ -8,6 +8,8 @@ enum asidrv_seqnum { ASIDRV_SEQ_NOP, /* empty sequence */ ASIDRV_SEQ_PRINTK, /* printk sequence */ + ASIDRV_SEQ_MEM, /* access unmapped memory */ + ASIDRV_SEQ_MEMMAP, /* access mapped memory */ }; enum asidrv_run_error { @@ -17,6 +19,7 @@ enum asidrv_run_error { ASIDRV_RUN_ERR_MAP_TASK, /* failed to map current task */ ASIDRV_RUN_ERR_ENTER, /* failed to enter ASI */ ASIDRV_RUN_ERR_ACTIVE, /* ASI is not active after entering ASI */ + ASIDRV_RUN_ERR_MAP_BUFFER, /* failed to map buffer */ }; #define ASIDRV_IOCTL_RUN_SEQUENCE _IOWR('a', 1, struct asidrv_run_param) From patchwork Mon May 4 15:02:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526507 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 121891392 for ; Mon, 4 May 2020 15:06:41 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id C4BEF206D7 for ; Mon, 4 May 2020 15:06:40 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="Wovy85Nu" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C4BEF206D7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id D0A498E0045; Mon, 4 May 2020 11:06:39 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id C92D28E0024; Mon, 4 May 2020 11:06:39 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B83218E0045; Mon, 4 May 2020 11:06:39 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0215.hostedemail.com [216.40.44.215]) by kanga.kvack.org (Postfix) with ESMTP id 96A2A8E0024 for ; Mon, 4 May 2020 11:06:39 -0400 (EDT) Received: from smtpin10.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id 4468C1AA70 for ; Mon, 4 May 2020 15:06:39 +0000 (UTC) X-FDA: 76779363318.10.crow66_743f887734c24 X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30029:30034:30045:30054:30056:30064:30075:30083,0,RBL:141.146.126.78:@oracle.com:.lbl8.mailshell.net-62.18.0.100 64.10.201.10,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:24,LUA_SUMMARY:none X-HE-Tag: crow66_743f887734c24 X-Filterd-Recvd-Size: 10609 Received: from aserp2120.oracle.com (aserp2120.oracle.com [141.146.126.78]) by imf29.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:06:38 +0000 (UTC) Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044En94t024657; Mon, 4 May 2020 15:06:28 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=TsfNA6aorPpafB8fClYecJanumAnNS8Ljhz97+DWLfM=; b=Wovy85NuyHmmWJoauriI36ih1f7o8Ert7+xdsH6Zch/sMmwRlCbUOvbMDctNouZ17f0H cv+14keFS1whMe9xfLtUT8dzbcSfDsRMIxC5CWik/kzekWxcKQn3YVzEI0rEaOQAZZWL 4TaI0pY3Rvj0b6/yHtSh9OoN1KtWFf+8Y/8mvom+FGkeWbWf1asMuafQUhkQfG7pKWCV g26cawiO9uaiA5zq5d9HGMVhl7oX8O8QUPiI4iFf5Mw03lIdaFoR+tgCOhVzqMpELeiK RvSZSi0ps9aY/skd/1ZftQtyKFnFmaKG8QXvW3da01F5sRObIURqM3OvSvoWncOBnCaG SQ== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by aserp2120.oracle.com with ESMTP id 30s0tm7f91-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:06:28 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044Eke6u094674; Mon, 4 May 2020 15:04:28 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserp3030.oracle.com with ESMTP id 30sjdqqp38-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:28 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 044F4PfF025248; Mon, 4 May 2020 15:04:26 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:25 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 05/14] asidrv: Sequence to test interrupt on ASI Date: Mon, 4 May 2020 17:02:26 +0200 Message-Id: <20200504150235.12171-6-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 suspectscore=0 mlxscore=0 bulkscore=0 adultscore=0 phishscore=0 mlxlogscore=999 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 mlxscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 phishscore=0 clxscore=1015 bulkscore=0 mlxlogscore=999 adultscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add a sequence to test if an ASI remains active after receiving an interrupt. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/asidrv.c | 144 +++++++++++++++++++++++++++++++++-- drivers/staging/asi/asidrv.h | 5 ++ 2 files changed, 144 insertions(+), 5 deletions(-) diff --git a/drivers/staging/asi/asidrv.c b/drivers/staging/asi/asidrv.c index 4231b56db167..a3c7da2bf16e 100644 --- a/drivers/staging/asi/asidrv.c +++ b/drivers/staging/asi/asidrv.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -19,6 +20,12 @@ /* Number of read for mem/memmap test sequence */ #define ASIDRV_MEM_READ_COUNT 1000 +/* Timeout for target to be ready to receive an interrupt */ +#define ASIDRV_TIMEOUT_TARGET_READY 1 + +/* Timeout for receiving an interrupt */ +#define ASIDRV_TIMEOUT_INTERRUPT 5 + enum asidrv_state { ASIDRV_STATE_NONE, ASIDRV_STATE_INTR_WAITING, @@ -29,6 +36,13 @@ struct asidrv_test { struct asi *asi; /* ASI for testing */ struct dpt *dpt; /* ASI decorated page-table */ char *buffer; /* buffer for testing */ + + /* runtime */ + atomic_t state; /* runtime state */ + int cpu; /* cpu the test is running on */ + struct work_struct work; /* work for other cpu */ + bool work_set; + enum asidrv_run_error run_error; }; struct asidrv_sequence { @@ -160,6 +174,107 @@ static int asidrv_asi_is_active(struct asi *asi) return false; } +/* + * Wait for an atomic value to be set or the timeout to expire. + * Return 0 if the value is set, or -1 if the timeout expires. + */ +static enum asidrv_run_error asidrv_wait(struct asidrv_test *test, + int value, unsigned int timeout) +{ + cycles_t start = get_cycles(); + cycles_t stop = start + timeout * tsc_khz * 1000; + + while (get_cycles() < stop) { + if (atomic_read(&test->state) == value || + test->run_error != ASIDRV_RUN_ERR_NONE) + return test->run_error; + cpu_relax(); + } + + /* timeout reached */ + return ASIDRV_RUN_ERR_TIMEOUT; +} + +/* + * Wait for an atomic value to transition from the initial value (set + * on entry) to the final value, or to timeout. Return 0 if the transition + * was done, or -1 if the timeout expires. + */ +static enum asidrv_run_error asidrv_wait_transition(struct asidrv_test *test, + int initial, int final, + unsigned int timeout) +{ + /* set the initial state value */ + atomic_set(&test->state, initial); + + /* do an active wait for the state changes */ + return asidrv_wait(test, final, timeout); +} + +/* + * Interrupt Test Sequence + */ + +static void asidrv_intr_handler(void *info) +{ + struct asidrv_test *test = info; + + /* ASI should be interrupted by the interrupt */ + if (asidrv_asi_is_active(test->asi)) { + test->run_error = ASIDRV_RUN_ERR_INTR_ASI_ACTIVE; + atomic_set(&test->state, ASIDRV_STATE_INTR_RECEIVED); + return; + } + + pr_debug("Received interrupt\n"); + atomic_set(&test->state, ASIDRV_STATE_INTR_RECEIVED); +} + +static void asidrv_intr_send(struct work_struct *work) +{ + struct asidrv_test *test = container_of(work, struct asidrv_test, work); + enum asidrv_run_error err; + + /* wait for cpu target to be ready, then send an interrupt */ + err = asidrv_wait(test, + ASIDRV_STATE_INTR_WAITING, + ASIDRV_TIMEOUT_TARGET_READY); + if (err) { + pr_debug("Target cpu %d not ready, interrupt not sent: error %d\n", + test->cpu, err); + return; + } + + pr_debug("Sending interrupt to cpu %d\n", test->cpu); + smp_call_function_single(test->cpu, asidrv_intr_handler, + test, false); +} + +static enum asidrv_run_error asidrv_intr_setup(struct asidrv_test *test) +{ + /* set work to have another cpu to send us an interrupt */ + INIT_WORK(&test->work, asidrv_intr_send); + test->work_set = true; + return ASIDRV_RUN_ERR_NONE; +} + +static enum asidrv_run_error asidrv_intr_run(struct asidrv_test *test) +{ + enum asidrv_run_error err; + + /* wait for state changes indicating that an interrupt was received */ + err = asidrv_wait_transition(test, + ASIDRV_STATE_INTR_WAITING, + ASIDRV_STATE_INTR_RECEIVED, + ASIDRV_TIMEOUT_INTERRUPT); + if (err == ASIDRV_RUN_ERR_TIMEOUT) { + pr_debug("Interrupt wait timeout\n"); + err = ASIDRV_RUN_ERR_INTR; + } + + return err; +} + /* * Memory Buffer Access Test Sequences */ @@ -231,12 +346,18 @@ struct asidrv_sequence asidrv_sequences[] = { "memmap", asidrv_memmap_setup, asidrv_mem_run, asidrv_memmap_cleanup, }, + [ASIDRV_SEQ_INTERRUPT] = { + "interrupt", + asidrv_intr_setup, asidrv_intr_run, NULL, + }, }; static enum asidrv_run_error asidrv_run_init(struct asidrv_test *test) { int err; + test->run_error = ASIDRV_RUN_ERR_NONE; + /* * Map the current stack, we need it to enter ASI. */ @@ -272,18 +393,31 @@ static void asidrv_run_fini(struct asidrv_test *test) static enum asidrv_run_error asidrv_run_setup(struct asidrv_test *test, struct asidrv_sequence *sequence) { - int run_err = ASIDRV_RUN_ERR_NONE; + unsigned int other_cpu; + int run_err; + + test->work_set = false; if (sequence->setup) { run_err = sequence->setup(test); if (run_err) - goto failed; + return run_err; } - return ASIDRV_RUN_ERR_NONE; + if (test->work_set) { + other_cpu = cpumask_any_but(cpu_online_mask, test->cpu); + if (other_cpu == test->cpu) { + pr_debug("Sequence %s requires an extra online cpu\n", + sequence->name); + asidrv_run_cleanup(test, sequence); + return ASIDRV_RUN_ERR_NCPUS; + } -failed: - return run_err; + atomic_set(&test->state, ASIDRV_STATE_NONE); + schedule_work_on(other_cpu, &test->work); + } + + return ASIDRV_RUN_ERR_NONE; } static void asidrv_run_cleanup(struct asidrv_test *test, diff --git a/drivers/staging/asi/asidrv.h b/drivers/staging/asi/asidrv.h index 1e820cc64f13..8055d96a0058 100644 --- a/drivers/staging/asi/asidrv.h +++ b/drivers/staging/asi/asidrv.h @@ -10,6 +10,7 @@ enum asidrv_seqnum { ASIDRV_SEQ_PRINTK, /* printk sequence */ ASIDRV_SEQ_MEM, /* access unmapped memory */ ASIDRV_SEQ_MEMMAP, /* access mapped memory */ + ASIDRV_SEQ_INTERRUPT, /* interrupt sequence */ }; enum asidrv_run_error { @@ -20,6 +21,10 @@ enum asidrv_run_error { ASIDRV_RUN_ERR_ENTER, /* failed to enter ASI */ ASIDRV_RUN_ERR_ACTIVE, /* ASI is not active after entering ASI */ ASIDRV_RUN_ERR_MAP_BUFFER, /* failed to map buffer */ + ASIDRV_RUN_ERR_NCPUS, /* not enough active cpus */ + ASIDRV_RUN_ERR_INTR, /* no interrupt received */ + ASIDRV_RUN_ERR_INTR_ASI_ACTIVE, /* ASI active in interrupt handler */ + ASIDRV_RUN_ERR_TIMEOUT, }; #define ASIDRV_IOCTL_RUN_SEQUENCE _IOWR('a', 1, struct asidrv_run_param) From patchwork Mon May 4 15:02:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526487 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 7F72C1392 for ; Mon, 4 May 2020 15:04:44 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 3DF9820721 for ; Mon, 4 May 2020 15:04:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="0EvFlkon" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3DF9820721 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 5DFA48E003B; Mon, 4 May 2020 11:04:43 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 58F908E0024; Mon, 4 May 2020 11:04:43 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 47EDD8E003B; Mon, 4 May 2020 11:04:43 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0021.hostedemail.com [216.40.44.21]) by kanga.kvack.org (Postfix) with ESMTP id 2F4928E0024 for ; Mon, 4 May 2020 11:04:43 -0400 (EDT) Received: from smtpin15.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id EA2D619B3B for ; Mon, 4 May 2020 15:04:42 +0000 (UTC) X-FDA: 76779358404.15.pain19_63536d7b7ef46 X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30029:30034:30045:30054:30056:30064:30083,0,RBL:141.146.126.78:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:24,LUA_SUMMARY:none X-HE-Tag: pain19_63536d7b7ef46 X-Filterd-Recvd-Size: 9289 Received: from aserp2120.oracle.com (aserp2120.oracle.com [141.146.126.78]) by imf28.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:04:42 +0000 (UTC) Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044EnCpH024792; Mon, 4 May 2020 15:04:33 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=KMhLfUUORB4hr0fqDKVZeX4aBmENNBKC3TwFFkS0PTg=; b=0EvFlkonA6jrCdVIfhf8VpmuuPLKTUpLjp5GSHIitz1iWFZNCN/pbdfltSTbdM9g0Mz5 FNH9CFTV63gUajXq3WqdiWAb1UOq8FQIch9Ub5zYB368gLh3ZfcX45nhJk8QjQ7eMoyM ykQ3uh5toR5OCGwP9/wyx/U47s59vietCsEscjl2Cbp0Yw9xHwQHJrXSJKhkyHycYNCp zAaMXRWF/rGnaPuwY8IGnnFtpcSXLi+1NynclpB0IZ6gEOURUvYVOsaOsn+qE1vVNjCa 5jjzfNCyNejYqUoa1CYhWJhd6zkfhvz+38X0lAnUGx81jfXAGEQhTXl8Jd9EUe3s4zLA Ng== Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by aserp2120.oracle.com with ESMTP id 30s0tm7eq0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:32 +0000 Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044EmUe7105604; Mon, 4 May 2020 15:04:32 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userp3020.oracle.com with ESMTP id 30sjjw1780-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:31 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 044F4Tie004322; Mon, 4 May 2020 15:04:29 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:29 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 06/14] asidrv: Sequence to test NMI on ASI Date: Mon, 4 May 2020 17:02:27 +0200 Message-Id: <20200504150235.12171-7-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxscore=0 phishscore=0 bulkscore=0 malwarescore=0 spamscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 mlxscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 phishscore=0 clxscore=1015 bulkscore=0 mlxlogscore=999 adultscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add a sequence to test if an ASI remains active after receiving an NMI. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/asidrv.c | 116 ++++++++++++++++++++++++++++++++++- drivers/staging/asi/asidrv.h | 4 ++ 2 files changed, 118 insertions(+), 2 deletions(-) diff --git a/drivers/staging/asi/asidrv.c b/drivers/staging/asi/asidrv.c index a3c7da2bf16e..8f964c9e0b14 100644 --- a/drivers/staging/asi/asidrv.c +++ b/drivers/staging/asi/asidrv.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -20,16 +21,21 @@ /* Number of read for mem/memmap test sequence */ #define ASIDRV_MEM_READ_COUNT 1000 -/* Timeout for target to be ready to receive an interrupt */ +/* Timeout for target to be ready to receive an interrupt or NMI */ #define ASIDRV_TIMEOUT_TARGET_READY 1 -/* Timeout for receiving an interrupt */ +/* Timeout for receiving an interrupt or NMI */ #define ASIDRV_TIMEOUT_INTERRUPT 5 +/* NMI handler name used for testing */ +#define ASIDRV_NMI_HANDLER_NAME "ASI Test" + enum asidrv_state { ASIDRV_STATE_NONE, ASIDRV_STATE_INTR_WAITING, ASIDRV_STATE_INTR_RECEIVED, + ASIDRV_STATE_NMI_WAITING, + ASIDRV_STATE_NMI_RECEIVED, }; struct asidrv_test { @@ -53,6 +59,7 @@ struct asidrv_sequence { }; static struct asidrv_test *asidrv_test; +static struct asidrv_test *asidrv_nmi_target; static void asidrv_test_destroy(struct asidrv_test *test); static void asidrv_run_fini(struct asidrv_test *test); @@ -211,6 +218,107 @@ static enum asidrv_run_error asidrv_wait_transition(struct asidrv_test *test, return asidrv_wait(test, final, timeout); } +/* + * NMI Test Sequence + */ + +static int asidrv_nmi_handler(unsigned int val, struct pt_regs *regs) +{ + struct asidrv_test *test = asidrv_nmi_target; + + if (!test) + return NMI_DONE; + + /* ASI should be interrupted by the NMI */ + if (asidrv_asi_is_active(test->asi)) { + test->run_error = ASIDRV_RUN_ERR_NMI_ASI_ACTIVE; + atomic_set(&test->state, ASIDRV_STATE_NMI_RECEIVED); + return NMI_HANDLED; + } + + pr_debug("Received NMI\n"); + atomic_set(&test->state, ASIDRV_STATE_NMI_RECEIVED); + asidrv_nmi_target = NULL; + + return NMI_HANDLED; +} + +static void asidrv_nmi_send(struct work_struct *work) +{ + struct asidrv_test *test = container_of(work, struct asidrv_test, work); + cpumask_t mask = CPU_MASK_NONE; + enum asidrv_run_error err; + + cpumask_set_cpu(test->cpu, &mask); + + /* wait for cpu target to be ready, then send an NMI */ + err = asidrv_wait(test, + ASIDRV_STATE_NMI_WAITING, + ASIDRV_TIMEOUT_TARGET_READY); + if (err) { + pr_debug("Target cpu %d not ready, NMI not sent: error %d\n", + test->cpu, err); + return; + } + + pr_debug("Sending NMI to cpu %d\n", test->cpu); + asidrv_nmi_target = test; + /* + * The value of asidrv_nmi_target should be set and propagated + * before sending the IPI. + */ + wmb(); + apic->send_IPI_mask(&mask, NMI_VECTOR); +} + +static enum asidrv_run_error asidrv_nmi_setup(struct asidrv_test *test) +{ + int err; + + err = register_nmi_handler(NMI_LOCAL, asidrv_nmi_handler, + NMI_FLAG_FIRST, + ASIDRV_NMI_HANDLER_NAME); + if (err) { + pr_debug("Failed to register NMI handler\n"); + return ASIDRV_RUN_ERR_NMI_REG; + } + + /* set work to have another cpu to send us an NMI */ + INIT_WORK(&test->work, asidrv_nmi_send); + + test->work_set = true; + + return ASIDRV_RUN_ERR_NONE; +} + +static void asidrv_nmi_cleanup(struct asidrv_test *test) +{ + unregister_nmi_handler(NMI_LOCAL, ASIDRV_NMI_HANDLER_NAME); +} + +static enum asidrv_run_error asidrv_nmi_run(struct asidrv_test *test) +{ + enum asidrv_run_error err; + unsigned long flags; + + /* disable interrupts as we want to be interrupted by an NMI */ + local_irq_save(flags); + + /* wait for state changes indicating that an NMI was received */ + err = asidrv_wait_transition(test, + ASIDRV_STATE_NMI_WAITING, + ASIDRV_STATE_NMI_RECEIVED, + ASIDRV_TIMEOUT_INTERRUPT); + if (err == ASIDRV_RUN_ERR_TIMEOUT) { + pr_debug("NMI wait timeout\n"); + err = ASIDRV_RUN_ERR_NMI; + } + + local_irq_restore(flags); + + return err; +} + /* * Interrupt Test Sequence */ @@ -350,6 +458,10 @@ struct asidrv_sequence asidrv_sequences[] = { "interrupt", asidrv_intr_setup, asidrv_intr_run, NULL, }, + [ASIDRV_SEQ_NMI] = { + "nmi", + asidrv_nmi_setup, asidrv_nmi_run, asidrv_nmi_cleanup, + }, }; static enum asidrv_run_error asidrv_run_init(struct asidrv_test *test) diff --git a/drivers/staging/asi/asidrv.h b/drivers/staging/asi/asidrv.h index 8055d96a0058..6fac32d56f6f 100644 --- a/drivers/staging/asi/asidrv.h +++ b/drivers/staging/asi/asidrv.h @@ -11,6 +11,7 @@ enum asidrv_seqnum { ASIDRV_SEQ_MEM, /* access unmapped memory */ ASIDRV_SEQ_MEMMAP, /* access mapped memory */ ASIDRV_SEQ_INTERRUPT, /* interrupt sequence */ + ASIDRV_SEQ_NMI, /* NMI interrupt sequence */ }; enum asidrv_run_error { @@ -25,6 +26,9 @@ enum asidrv_run_error { ASIDRV_RUN_ERR_INTR, /* no interrupt received */ ASIDRV_RUN_ERR_INTR_ASI_ACTIVE, /* ASI active in interrupt handler */ ASIDRV_RUN_ERR_TIMEOUT, + ASIDRV_RUN_ERR_NMI, /* no NMI received */ + ASIDRV_RUN_ERR_NMI_REG, /* failed to register NMI handler */ + ASIDRV_RUN_ERR_NMI_ASI_ACTIVE, /* ASI active in NMI handler */ }; #define ASIDRV_IOCTL_RUN_SEQUENCE _IOWR('a', 1, struct asidrv_run_param) From patchwork Mon May 4 15:02:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526489 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 84D951392 for ; Mon, 4 May 2020 15:04:49 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 39DDC206D7 for ; Mon, 4 May 2020 15:04:49 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="RryTrC2i" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 39DDC206D7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 36EFD8E003C; Mon, 4 May 2020 11:04:48 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 31FC48E0024; Mon, 4 May 2020 11:04:48 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2348A8E003C; Mon, 4 May 2020 11:04:48 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0116.hostedemail.com [216.40.44.116]) by kanga.kvack.org (Postfix) with ESMTP id 0C0E58E0024 for ; Mon, 4 May 2020 11:04:48 -0400 (EDT) Received: from smtpin28.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id C609E1AA91 for ; Mon, 4 May 2020 15:04:47 +0000 (UTC) X-FDA: 76779358614.28.guide11_6401163fe7f5e X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30045:30054:30064:30075:30083,0,RBL:156.151.31.85:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:23,LUA_SUMMARY:none X-HE-Tag: guide11_6401163fe7f5e X-Filterd-Recvd-Size: 7716 Received: from userp2120.oracle.com (userp2120.oracle.com [156.151.31.85]) by imf26.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:04:46 +0000 (UTC) Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044Elis7024656; Mon, 4 May 2020 15:04:36 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=HlwbAlrpx3vJnc/cnvhjjhhjODFL/A8igwurSCDOi0E=; b=RryTrC2iKUzql/6iQwhgQEfato+6RYgoLKaBxF3C7xSU2LRYifSZ8jn5Z+gn9Ib1eLyG SZ+J7dyyfUrI1EvUiV0mJR5J4N3ku1CyiKV2HNcsMqKKDK/Q/XOIi4MDKTP7ua3ZawA5 4GfyRU3CTGbQNkBBHHTWgO2FKVIlSI3/c/oxSf8TPkl8pbuRo7i+6CCh8zWhnXurx+zt 1QjL1za2eyPvIOOncy7wxtu0V7NCnzYaHKm8hyFqfSWJlB3D++Egvruaj7XHrF0wlP4Z +txG1BSOep3Z3ziFMdkSgBDyta3kIe4vMQT5JEwk5GygVoYLz78b0S5XdeQRE7xcErAp jg== Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by userp2120.oracle.com with ESMTP id 30s1gmy9mg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:36 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044ElbZt053429; Mon, 4 May 2020 15:04:35 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userp3030.oracle.com with ESMTP id 30t1r2f7eq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:35 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 044F4XVp004344; Mon, 4 May 2020 15:04:33 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:33 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 07/14] asidrv: Sequence to test interrupt+NMI on ASI Date: Mon, 4 May 2020 17:02:28 +0200 Message-Id: <20200504150235.12171-8-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 adultscore=0 suspectscore=0 spamscore=0 mlxlogscore=999 malwarescore=0 phishscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 suspectscore=0 mlxscore=0 spamscore=0 clxscore=1015 priorityscore=1501 bulkscore=0 phishscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add a sequence to test if an ASI remains active after receiving an interrupt which is itself interrupted by an NMI. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/asidrv.c | 62 +++++++++++++++++++++++++++++++++++- drivers/staging/asi/asidrv.h | 1 + 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/drivers/staging/asi/asidrv.c b/drivers/staging/asi/asidrv.c index 8f964c9e0b14..e08f2a107e89 100644 --- a/drivers/staging/asi/asidrv.c +++ b/drivers/staging/asi/asidrv.c @@ -49,6 +49,7 @@ struct asidrv_test { struct work_struct work; /* work for other cpu */ bool work_set; enum asidrv_run_error run_error; + bool intrnmi; }; struct asidrv_sequence { @@ -65,6 +66,7 @@ static void asidrv_test_destroy(struct asidrv_test *test); static void asidrv_run_fini(struct asidrv_test *test); static void asidrv_run_cleanup(struct asidrv_test *test, struct asidrv_sequence *sequence); +static void asidrv_intrnmi_send(struct work_struct *work); static struct asidrv_test *asidrv_test_create(void) { @@ -284,7 +286,10 @@ static enum asidrv_run_error asidrv_nmi_setup(struct asidrv_test *test) } /* set work to have another cpu to send us an NMI */ - INIT_WORK(&test->work, asidrv_nmi_send); + if (test->intrnmi) + INIT_WORK(&test->work, asidrv_intrnmi_send); + else + INIT_WORK(&test->work, asidrv_nmi_send); test->work_set = true; @@ -336,6 +341,12 @@ static void asidrv_intr_handler(void *info) pr_debug("Received interrupt\n"); atomic_set(&test->state, ASIDRV_STATE_INTR_RECEIVED); + + if (!test->intrnmi) + return; + + pr_debug("Waiting for NMI in interrupt\n"); + asidrv_nmi_run(test); } static void asidrv_intr_send(struct work_struct *work) @@ -383,6 +394,50 @@ static enum asidrv_run_error asidrv_intr_run(struct asidrv_test *test) return err; } +/* + * Interrupt+NMI Test Sequence + */ + +static void asidrv_intrnmi_send(struct work_struct *work) +{ + /* send and interrupt and then send an NMI */ + asidrv_intr_send(work); + asidrv_nmi_send(work); +} + +static enum asidrv_run_error asidrv_intrnmi_setup(struct asidrv_test *test) +{ + test->intrnmi = true; + return asidrv_nmi_setup(test); +} + +static enum asidrv_run_error asidrv_intrnmi_run(struct asidrv_test *test) +{ + enum asidrv_run_error err; + enum asidrv_state state; + + /* + * Wait for state changes indicating that an interrupt and + * then an NMI were received. + */ + err = asidrv_wait_transition(test, + ASIDRV_STATE_INTR_WAITING, + ASIDRV_STATE_NMI_RECEIVED, + ASIDRV_TIMEOUT_INTERRUPT); + if (err == ASIDRV_RUN_ERR_TIMEOUT) { + state = atomic_read(&test->state); + if (state == ASIDRV_STATE_INTR_WAITING) { + pr_debug("Interrupt wait timeout\n"); + err = ASIDRV_RUN_ERR_INTR; + } else { + pr_debug("NMI wait timeout\n"); + err = ASIDRV_RUN_ERR_NMI; + } + } + + return err; +} + /* * Memory Buffer Access Test Sequences */ @@ -462,6 +517,10 @@ struct asidrv_sequence asidrv_sequences[] = { "nmi", asidrv_nmi_setup, asidrv_nmi_run, asidrv_nmi_cleanup, }, + [ASIDRV_SEQ_INTRNMI] = { + "intr+nmi", + asidrv_intrnmi_setup, asidrv_intrnmi_run, asidrv_nmi_cleanup, + }, }; static enum asidrv_run_error asidrv_run_init(struct asidrv_test *test) @@ -509,6 +568,7 @@ static enum asidrv_run_error asidrv_run_setup(struct asidrv_test *test, int run_err; test->work_set = false; + test->intrnmi = false; if (sequence->setup) { run_err = sequence->setup(test); diff --git a/drivers/staging/asi/asidrv.h b/drivers/staging/asi/asidrv.h index 6fac32d56f6f..de9f7ad993e0 100644 --- a/drivers/staging/asi/asidrv.h +++ b/drivers/staging/asi/asidrv.h @@ -12,6 +12,7 @@ enum asidrv_seqnum { ASIDRV_SEQ_MEMMAP, /* access mapped memory */ ASIDRV_SEQ_INTERRUPT, /* interrupt sequence */ ASIDRV_SEQ_NMI, /* NMI interrupt sequence */ + ASIDRV_SEQ_INTRNMI, /* NMI in interrupt sequence */ }; enum asidrv_run_error { From patchwork Mon May 4 15:02:29 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526491 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 4CA911392 for ; Mon, 4 May 2020 15:04:54 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 12EA720721 for ; Mon, 4 May 2020 15:04:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="h4bL8Bul" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 12EA720721 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id B841A8E003D; Mon, 4 May 2020 11:04:52 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id B35958E0024; Mon, 4 May 2020 11:04:52 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A729B8E003D; Mon, 4 May 2020 11:04:52 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0020.hostedemail.com [216.40.44.20]) by kanga.kvack.org (Postfix) with ESMTP id 8C65D8E0024 for ; Mon, 4 May 2020 11:04:52 -0400 (EDT) Received: from smtpin27.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 6199DE0BC for ; Mon, 4 May 2020 15:04:52 +0000 (UTC) X-FDA: 76779358824.27.bun88_64a78c8048450 X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30029:30034:30045:30054:30056:30064,0,RBL:156.151.31.85:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:1,LUA_SUMMARY:none X-HE-Tag: bun88_64a78c8048450 X-Filterd-Recvd-Size: 9009 Received: from userp2120.oracle.com (userp2120.oracle.com [156.151.31.85]) by imf05.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:04:51 +0000 (UTC) Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044Elhhg024555; Mon, 4 May 2020 15:04:40 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=OTy8bFEepziAap9YJkk0SYeg/Bi8nvhGZOVavHSgpoA=; b=h4bL8BulIgg78eyOq3XCjR0Y17cD8h5dvBaIkIfEQvxPrpsafN/+zTpQppm+XXet/ZNm 3y1rgnXZ0/QQZ49pjBq6XQWR5oIn+XoZxiR/HfTToSJ7Bt6Mj5TS1qRsNPykkQuhQuXW TSO3g9WD7yXJjviAj8aOqAhz8taVHKNt004Ma/NnMafYqk6pA6w+Yx+fKorymrG6Awz0 6wMgVsZ9opuh3KzVTQ3RpQIQm3CYld65xqv9auT8pOJU1BtKRm4eJLYylOtlJOhbBcZ3 vzNMtj9UGQlXNNH0+I2EMjg1jiORkHnwWfLwMdpgorkxxBxmU/H403Pk81dYS3XXioKW Lg== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by userp2120.oracle.com with ESMTP id 30s1gmy9n0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:40 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044EkeFY094664; Mon, 4 May 2020 15:04:39 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by aserp3030.oracle.com with ESMTP id 30sjdqqpwm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:39 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 044F4bsX025389; Mon, 4 May 2020 15:04:37 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:37 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 08/14] asidrv: Sequence to test scheduling in/out with ASI Date: Mon, 4 May 2020 17:02:29 +0200 Message-Id: <20200504150235.12171-9-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 suspectscore=0 mlxscore=0 bulkscore=0 adultscore=0 phishscore=0 mlxlogscore=999 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 suspectscore=0 mlxscore=0 spamscore=0 clxscore=1015 priorityscore=1501 bulkscore=0 phishscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add a sequence to test if an ASI remains active after it is scheduled out and then scheduled back in. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/asidrv.c | 98 ++++++++++++++++++++++++++++++++++++ drivers/staging/asi/asidrv.h | 2 + 2 files changed, 100 insertions(+) diff --git a/drivers/staging/asi/asidrv.c b/drivers/staging/asi/asidrv.c index e08f2a107e89..9ca17e0b654e 100644 --- a/drivers/staging/asi/asidrv.c +++ b/drivers/staging/asi/asidrv.c @@ -4,6 +4,7 @@ */ #include +#include #include #include #include @@ -21,17 +22,24 @@ /* Number of read for mem/memmap test sequence */ #define ASIDRV_MEM_READ_COUNT 1000 +/* Number of loop for the sched test sequence */ +#define ASIDRV_SCHED_LOOP_COUNT 20 + /* Timeout for target to be ready to receive an interrupt or NMI */ #define ASIDRV_TIMEOUT_TARGET_READY 1 /* Timeout for receiving an interrupt or NMI */ #define ASIDRV_TIMEOUT_INTERRUPT 5 +/* Timeout before thread can start its job */ +#define ASIDRV_TIMEOUT_THREAD_START 5 + /* NMI handler name used for testing */ #define ASIDRV_NMI_HANDLER_NAME "ASI Test" enum asidrv_state { ASIDRV_STATE_NONE, + ASIDRV_STATE_START, ASIDRV_STATE_INTR_WAITING, ASIDRV_STATE_INTR_RECEIVED, ASIDRV_STATE_NMI_WAITING, @@ -50,6 +58,8 @@ struct asidrv_test { bool work_set; enum asidrv_run_error run_error; bool intrnmi; + struct task_struct *kthread; /* work on same cpu */ + int count; }; struct asidrv_sequence { @@ -438,6 +448,66 @@ static enum asidrv_run_error asidrv_intrnmi_run(struct asidrv_test *test) return err; } +/* + * Sched Test Sequence + */ + +static void asidrv_sched_loop(struct asidrv_test *test) +{ + int last_count = 0; + + while (test->count < ASIDRV_SCHED_LOOP_COUNT) { + test->count++; + last_count = test->count; + /* + * Call into the scheduler, until it runs the other + * asidrv_sched_loop() task. We know it has run when + * test->count changes. + */ + while (last_count == test->count) + schedule(); + } + test->count++; +} + +static int asidrv_sched_kthread(void *data) +{ + struct asidrv_test *test = data; + enum asidrv_run_error err; + + err = asidrv_wait(test, ASIDRV_STATE_START, + ASIDRV_TIMEOUT_THREAD_START); + if (err) { + pr_debug("Error waiting for start state: error %d\n", err); + return err; + } + asidrv_sched_loop(test); + + return 0; +} + +static enum asidrv_run_error asidrv_sched_init(struct asidrv_test *test) +{ + test->kthread = kthread_create_on_node(asidrv_sched_kthread, test, + cpu_to_node(test->cpu), + "sched test"); + if (!test->kthread) + return ASIDRV_RUN_ERR_KTHREAD; + + kthread_bind(test->kthread, test->cpu); + test->count = 0; + + return ASIDRV_RUN_ERR_NONE; +} + +static enum asidrv_run_error asidrv_sched_run(struct asidrv_test *test) +{ + atomic_set(&test->state, ASIDRV_STATE_START); + asidrv_sched_loop(test); + + return ASIDRV_RUN_ERR_NONE; +} + /* * Memory Buffer Access Test Sequences */ @@ -521,14 +591,28 @@ struct asidrv_sequence asidrv_sequences[] = { "intr+nmi", asidrv_intrnmi_setup, asidrv_intrnmi_run, asidrv_nmi_cleanup, }, + [ASIDRV_SEQ_SCHED] = { + "sched", + asidrv_sched_init, asidrv_sched_run, NULL, + }, }; static enum asidrv_run_error asidrv_run_init(struct asidrv_test *test) { + cpumask_t mask = CPU_MASK_NONE; int err; test->run_error = ASIDRV_RUN_ERR_NONE; + /* + * Binding ourself to the current cpu but keep preemption + * enabled. + */ + test->cpu = get_cpu(); + cpumask_set_cpu(test->cpu, &mask); + set_cpus_allowed_ptr(current, &mask); + put_cpu(); + /* * Map the current stack, we need it to enter ASI. */ @@ -589,12 +673,26 @@ static enum asidrv_run_error asidrv_run_setup(struct asidrv_test *test, schedule_work_on(other_cpu, &test->work); } + if (test->kthread) + wake_up_process(test->kthread); + return ASIDRV_RUN_ERR_NONE; } static void asidrv_run_cleanup(struct asidrv_test *test, struct asidrv_sequence *sequence) { + if (test->kthread) { + kthread_stop(test->kthread); + test->kthread = NULL; + } + + if (test->work_set) { + /* ensure work has completed */ + flush_work(&test->work); + test->work_set = false; + } + if (sequence->cleanup) sequence->cleanup(test); } diff --git a/drivers/staging/asi/asidrv.h b/drivers/staging/asi/asidrv.h index de9f7ad993e0..9f540b119883 100644 --- a/drivers/staging/asi/asidrv.h +++ b/drivers/staging/asi/asidrv.h @@ -13,6 +13,7 @@ enum asidrv_seqnum { ASIDRV_SEQ_INTERRUPT, /* interrupt sequence */ ASIDRV_SEQ_NMI, /* NMI interrupt sequence */ ASIDRV_SEQ_INTRNMI, /* NMI in interrupt sequence */ + ASIDRV_SEQ_SCHED, /* schedule() sequence */ }; enum asidrv_run_error { @@ -30,6 +31,7 @@ enum asidrv_run_error { ASIDRV_RUN_ERR_NMI, /* no NMI received */ ASIDRV_RUN_ERR_NMI_REG, /* failed to register NMI handler */ ASIDRV_RUN_ERR_NMI_ASI_ACTIVE, /* ASI active in NMI handler */ + ASIDRV_RUN_ERR_KTHREAD, /* failed to create kernel thread */ }; #define ASIDRV_IOCTL_RUN_SEQUENCE _IOWR('a', 1, struct asidrv_run_param) From patchwork Mon May 4 15:02:30 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526511 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 5281714C0 for ; Mon, 4 May 2020 15:06:55 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 15605206D7 for ; Mon, 4 May 2020 15:06:55 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="Zggz8WZz" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 15605206D7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 3E1E28E0046; Mon, 4 May 2020 11:06:54 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 36BCD8E0024; Mon, 4 May 2020 11:06:54 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 25B1D8E0046; Mon, 4 May 2020 11:06:54 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0198.hostedemail.com [216.40.44.198]) by kanga.kvack.org (Postfix) with ESMTP id 0B3898E0024 for ; Mon, 4 May 2020 11:06:54 -0400 (EDT) Received: from smtpin13.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id C1D39180AD80F for ; Mon, 4 May 2020 15:06:53 +0000 (UTC) X-FDA: 76779363906.13.point85_765c2da303d4a X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30003:30034:30051:30054:30064:30089,0,RBL:156.151.31.86:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:1,LUA_SUMMARY:none X-HE-Tag: point85_765c2da303d4a X-Filterd-Recvd-Size: 8254 Received: from userp2130.oracle.com (userp2130.oracle.com [156.151.31.86]) by imf49.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:06:53 +0000 (UTC) Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044ElifK116784; Mon, 4 May 2020 15:06:43 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=B2uXdxYJUzNl2lMjTTjR6bplmjpOhPo7Ihfe5K+yde8=; b=Zggz8WZz+a42F1eiz01QmaSd9xLe0dv3JE6HqFkChmCj+nZO5yZxG9zmKP3rO/ef7kGr zSbCInKO1qE6hfwwj6VVY9aFUMsqYpzHlkfYE362YQxqh+jJDmKV7BlQkik6Sw2aMyQ3 mPcBi1pgi//3tNPB3yuxwH8gqm4A2Gk051CrFzKAATm2U1ft0/vReRqjUt+6jPlkmqPT GAbjsgqz6DJmXSvC5doQRDDzOTVbE2ZDN6oLGJ2SqptXQX/frCmloy2L5g3BPvzMortT ofRTaVS48mVDtociM/fhdV1QJyKRSxA9/WgyJpDGZeqynqeElH1TH1Q0ZfMxspamfJtk WA== Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by userp2130.oracle.com with ESMTP id 30s09qyhfx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:06:43 +0000 Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044EmV46105699; Mon, 4 May 2020 15:04:43 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userp3020.oracle.com with ESMTP id 30sjjw18dg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:43 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 044F4fW2030429; Mon, 4 May 2020 15:04:41 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:41 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 09/14] asidrv: Add ioctls to manage ASI page faults Date: Mon, 4 May 2020 17:02:30 +0200 Message-Id: <20200504150235.12171-10-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxscore=0 phishscore=0 bulkscore=0 malwarescore=0 spamscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 lowpriorityscore=0 spamscore=0 adultscore=0 clxscore=1015 suspectscore=0 priorityscore=1501 malwarescore=0 mlxlogscore=999 phishscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add ioctls to list and clear ASI page faults. Also add an ioctl to display or not stack trace on ASI page fault. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/asidrv.c | 88 ++++++++++++++++++++++++++++++++++++ drivers/staging/asi/asidrv.h | 32 +++++++++++++ 2 files changed, 120 insertions(+) diff --git a/drivers/staging/asi/asidrv.c b/drivers/staging/asi/asidrv.c index 9ca17e0b654e..e6edfbe5acea 100644 --- a/drivers/staging/asi/asidrv.c +++ b/drivers/staging/asi/asidrv.c @@ -4,6 +4,7 @@ */ #include +#include #include #include #include @@ -790,12 +791,99 @@ static int asidrv_ioctl_run_sequence(struct asidrv_test *test, return 0; } +/* + * ASI fault ioctls + */ + +static int asidrv_ioctl_list_fault(struct asi *asi, unsigned long arg) +{ + struct asidrv_fault_list __user *uflist; + struct asidrv_fault_list *flist; + size_t flist_size; + __u32 uflist_len; + int i; + + uflist = (struct asidrv_fault_list __user *)arg; + if (copy_from_user(&uflist_len, &uflist->length, sizeof(uflist_len))) + return -EFAULT; + + uflist_len = min_t(unsigned int, uflist_len, ASI_FAULT_LOG_SIZE); + + flist_size = sizeof(*flist) + sizeof(struct asidrv_fault) * uflist_len; + flist = kzalloc(flist_size, GFP_KERNEL); + if (!flist) + return -ENOMEM; + + for (i = 0; i < ASI_FAULT_LOG_SIZE; i++) { + if (!asi->fault_log[i].address) + break; + if (i < uflist_len) { + flist->fault[i].addr = asi->fault_log[i].address; + flist->fault[i].count = asi->fault_log[i].count; + sprint_symbol(flist->fault[i].symbol, + asi->fault_log[i].address); + } + } + flist->length = i; + + if (copy_to_user(uflist, flist, flist_size)) { + kfree(flist); + return -EFAULT; + } + + if (i >= ASI_FAULT_LOG_SIZE) + pr_warn("ASI %p: fault log buffer is full [%d]\n", asi, i); + + kfree(flist); + + return 0; +} + +static int asidrv_ioctl_clear_fault(struct asi *asi) +{ + int i; + + for (i = 0; i < ASI_FAULT_LOG_SIZE; i++) { + if (!asi->fault_log[i].address) + break; + asi->fault_log[i].address = 0; + } + + pr_debug("ASI %p: faults cleared\n", asi); + return 0; +} + +static int asidrv_ioctl_log_fault_stack(struct asi *asi, bool log_stack) +{ + if (log_stack) { + asi->fault_log_policy |= ASI_FAULT_LOG_STACK; + pr_debug("ASI %p: setting fault stack\n", asi); + } else { + asi->fault_log_policy &= ~ASI_FAULT_LOG_STACK; + pr_debug("ASI %p: clearing fault stack\n", asi); + } + + return 0; +} + static long asidrv_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct asidrv_test *test = asidrv_test; + struct asi *asi = test->asi; switch (cmd) { + /* ASI fault ioctls */ + + case ASIDRV_IOCTL_LIST_FAULT: + return asidrv_ioctl_list_fault(asi, arg); + + case ASIDRV_IOCTL_CLEAR_FAULT: + return asidrv_ioctl_clear_fault(asi); + + case ASIDRV_IOCTL_LOG_FAULT_STACK: + return asidrv_ioctl_log_fault_stack(asi, arg); + /* Test ioctls */ case ASIDRV_IOCTL_RUN_SEQUENCE: diff --git a/drivers/staging/asi/asidrv.h b/drivers/staging/asi/asidrv.h index 9f540b119883..99ab9843e36b 100644 --- a/drivers/staging/asi/asidrv.h +++ b/drivers/staging/asi/asidrv.h @@ -36,9 +36,41 @@ enum asidrv_run_error { #define ASIDRV_IOCTL_RUN_SEQUENCE _IOWR('a', 1, struct asidrv_run_param) +/* + * ASIDRV_IOCTL_LIST_FAULT: return the list of ASI faults. + * + * User should set 'length' with the number of entries available in the + * 'fault' array. On return, 'length' is set to the number of ASI faults + * (which can be larger than the original 'length' value), and the 'fault' + * array is filled with the ASI faults. + */ +#define ASIDRV_IOCTL_LIST_FAULT _IOWR('a', 2, struct asidrv_fault_list) +#define ASIDRV_IOCTL_CLEAR_FAULT _IO('a', 3) +#define ASIDRV_IOCTL_LOG_FAULT_STACK _IO('a', 4) + +#define ASIDRV_KSYM_NAME_LEN 128 +/* + * We need KSYM_SYMBOL_LEN to lookup symbol. However it's not part of + * userland include. So we use a reasonably large value (KSYM_SYMBOL_LEN + * is around 310). + */ +#define ASIDRV_KSYM_SYMBOL_LEN 512 + struct asidrv_run_param { __u32 sequence; /* sequence to run */ __u32 run_error; /* result error after run */ __u32 asi_active; /* ASI is active after run? */ }; + +struct asidrv_fault { + __u64 addr; + char symbol[ASIDRV_KSYM_SYMBOL_LEN]; + __u32 count; +}; + +struct asidrv_fault_list { + __u32 length; + struct asidrv_fault fault[0]; +}; + #endif From patchwork Mon May 4 15:02:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526515 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 3592514C0 for ; Mon, 4 May 2020 15:06:59 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id EC85A21582 for ; Mon, 4 May 2020 15:06:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="m8YGTl2P" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EC85A21582 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id E43048E0047; Mon, 4 May 2020 11:06:57 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id DF47B8E0024; Mon, 4 May 2020 11:06:57 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CE1DF8E0047; Mon, 4 May 2020 11:06:57 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0244.hostedemail.com [216.40.44.244]) by kanga.kvack.org (Postfix) with ESMTP id B1E768E0024 for ; Mon, 4 May 2020 11:06:57 -0400 (EDT) Received: from smtpin02.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 71FDD82437D1 for ; Mon, 4 May 2020 15:06:57 +0000 (UTC) X-FDA: 76779364074.02.spade48_76e515c23501e X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30034:30051:30054:30064:30089,0,RBL:141.146.126.78:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:1,LUA_SUMMARY:none X-HE-Tag: spade48_76e515c23501e X-Filterd-Recvd-Size: 9271 Received: from aserp2120.oracle.com (aserp2120.oracle.com [141.146.126.78]) by imf44.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:06:56 +0000 (UTC) Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044En9rR024707; Mon, 4 May 2020 15:06:48 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=6to12crgfoOIuzcAiBWiqiJcf/JFu8fFPEvAzj9Sfb8=; b=m8YGTl2PkOQ18N48rXkfB7xElNneljN8Ch1kqPBs1tVRiUPezq6M7ExACsbLB/c9gniX iGpRrqwNrlZU5+PLSR558eZPLd/1eykQGEFGYObMFyyNWYx/JoHW/lH05QJgDnH/SyJV R7FhN2GN9B6cGfgkBYIJVaVX5quTKerAt2tsg3zqlkUZGrRTOgpa5V1QH+K2/kZwHIE6 WOIPUJDxdBV6ZDsSe6TP7tzOhNEx0b6Wpi4LsIGCGvRDV4kolKaoEKwtnRCVzHDKqFIR zf+59BuqWcOat6nDcKwMxHKJnYPjPV47dwEYcTzP7HJxFmJUkkXJUoaBXVmwK8cqRegC EA== Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by aserp2120.oracle.com with ESMTP id 30s0tm7fbt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:06:48 +0000 Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044EmVN2105700; Mon, 4 May 2020 15:04:47 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userp3020.oracle.com with ESMTP id 30sjjw18q0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:47 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 044F4jdM025444; Mon, 4 May 2020 15:04:45 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:45 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 10/14] asidrv: Add ioctls to manage ASI mapped VA ranges Date: Mon, 4 May 2020 17:02:31 +0200 Message-Id: <20200504150235.12171-11-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxscore=0 phishscore=0 bulkscore=0 malwarescore=0 spamscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 mlxscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 phishscore=0 clxscore=1015 bulkscore=0 mlxlogscore=999 adultscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add ioctls to list, add, clear ASI mapped VA ranges. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/asidrv.c | 138 +++++++++++++++++++++++++++++++++++ drivers/staging/asi/asidrv.h | 26 +++++++ 2 files changed, 164 insertions(+) diff --git a/drivers/staging/asi/asidrv.c b/drivers/staging/asi/asidrv.c index e6edfbe5acea..9d9784629833 100644 --- a/drivers/staging/asi/asidrv.c +++ b/drivers/staging/asi/asidrv.c @@ -866,10 +866,137 @@ static int asidrv_ioctl_log_fault_stack(struct asi *asi, bool log_stack) return 0; } +/* + * ASI decorated pagetable ioctls + */ + +static int asidrv_ioctl_add_mapping(struct dpt *dpt, unsigned long arg) +{ + struct asidrv_mapping_list __user *umlist; + struct asidrv_mapping mapping; + __u32 umlist_len; + int i, err; + + umlist = (struct asidrv_mapping_list *)arg; + if (copy_from_user(¨ist_len, ¨ist->length, sizeof(umlist_len))) + return -EFAULT; + + err = 0; + for (i = 0; i < umlist_len; i++) { + if (copy_from_user(&mapping, ¨ist->mapping[i], + sizeof(mapping))) { + err = -EFAULT; + break; + } + + pr_debug("add mapping %llx/%llx/%u %s\n", + mapping.addr, mapping.size, mapping.level, + mapping.percpu ? "percpu" : ""); + + if (mapping.percpu) { + if (mapping.level != PGT_LEVEL_PTE) { + err = -EINVAL; + break; + } + err = dpt_map_percpu(dpt, (void *)mapping.addr, + mapping.size); + } else { + err = dpt_map_range(dpt, (void *)mapping.addr, + mapping.size, mapping.level); + } + if (err) + break; + } + + if (err) + return (i == 0) ? err : i; + + return 0; +} + +static int asidrv_ioctl_clear_mapping(struct dpt *dpt, unsigned long arg) +{ + struct asidrv_mapping_list __user *umlist; + struct asidrv_mapping mapping; + __u32 umlist_len; + int err, i; + + umlist = (struct asidrv_mapping_list *)arg; + if (copy_from_user(¨ist_len, ¨ist->length, sizeof(umlist_len))) + return -EFAULT; + + err = 0; + for (i = 0; i < umlist_len; i++) { + if (copy_from_user(&mapping, ¨ist->mapping[i], + sizeof(mapping))) { + err = -EFAULT; + break; + } + + pr_debug("clear mapping %llx %s\n", + mapping.addr, mapping.percpu ? "percpu" : ""); + + if (mapping.percpu) + dpt_unmap_percpu(dpt, (void *)mapping.addr); + else + dpt_unmap(dpt, (void *)mapping.addr); + } + + if (err) + return (i == 0) ? err : i; + + return 0; +} + +static int asidrv_ioctl_list_mapping(struct dpt *dpt, unsigned long arg) +{ + struct asidrv_mapping_list __user *umlist; + struct asidrv_mapping_list *mlist; + struct dpt_range_mapping *range; + unsigned long addr; + size_t mlist_size; + __u32 umlist_len; + int i; + + umlist = (struct asidrv_mapping_list *)arg; + if (copy_from_user(¨ist_len, ¨ist->length, sizeof(umlist_len))) + return -EFAULT; + + umlist_len = min_t(unsigned int, umlist_len, 512); + + mlist_size = sizeof(*mlist) + + sizeof(struct asidrv_mapping) * umlist_len; + mlist = kzalloc(mlist_size, GFP_KERNEL); + if (!mlist) + return -ENOMEM; + + i = 0; + list_for_each_entry(range, &dpt->mapping_list, list) { + if (i < umlist_len) { + addr = (__u64)range->ptr; + mlist->mapping[i].addr = addr; + mlist->mapping[i].size = range->size; + mlist->mapping[i].level = range->level; + } + i++; + } + mlist->length = i; + + if (copy_to_user(umlist, mlist, mlist_size)) { + kfree(mlist); + return -EFAULT; + } + + kfree(mlist); + + return 0; +} + static long asidrv_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct asidrv_test *test = asidrv_test; struct asi *asi = test->asi; + struct dpt *dpt = test->dpt; switch (cmd) { @@ -884,6 +1011,17 @@ static long asidrv_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) case ASIDRV_IOCTL_LOG_FAULT_STACK: return asidrv_ioctl_log_fault_stack(asi, arg); + /* ASI decorated pagetable ioctls */ + + case ASIDRV_IOCTL_LIST_MAPPING: + return asidrv_ioctl_list_mapping(dpt, arg); + + case ASIDRV_IOCTL_ADD_MAPPING: + return asidrv_ioctl_add_mapping(dpt, arg); + + case ASIDRV_IOCTL_CLEAR_MAPPING: + return asidrv_ioctl_clear_mapping(dpt, arg); + /* Test ioctls */ case ASIDRV_IOCTL_RUN_SEQUENCE: diff --git a/drivers/staging/asi/asidrv.h b/drivers/staging/asi/asidrv.h index 99ab9843e36b..f042106419db 100644 --- a/drivers/staging/asi/asidrv.h +++ b/drivers/staging/asi/asidrv.h @@ -48,6 +48,20 @@ enum asidrv_run_error { #define ASIDRV_IOCTL_CLEAR_FAULT _IO('a', 3) #define ASIDRV_IOCTL_LOG_FAULT_STACK _IO('a', 4) +/* + * ASIDRV_IOCTL_ADD_MAPPING: add mapping to the ASI. + * + * User should set 'length' with the number of mapping described in the + * 'mapping' array. + * Return value: + * -1 - error no mapping was added + * 0 - no error, all mappings were added + * N>0 - error but the first N mappings were added + */ +#define ASIDRV_IOCTL_ADD_MAPPING _IOWR('a', 5, struct asidrv_mapping_list) +#define ASIDRV_IOCTL_CLEAR_MAPPING _IOW('a', 6, struct asidrv_mapping_list) +#define ASIDRV_IOCTL_LIST_MAPPING _IOWR('a', 7, struct asidrv_mapping_list) + #define ASIDRV_KSYM_NAME_LEN 128 /* * We need KSYM_SYMBOL_LEN to lookup symbol. However it's not part of @@ -73,4 +87,16 @@ struct asidrv_fault_list { struct asidrv_fault fault[0]; }; +struct asidrv_mapping { + __u64 addr; + __u64 size; + __u32 level; + __u32 percpu; +}; + +struct asidrv_mapping_list { + __u32 length; + struct asidrv_mapping mapping[0]; +}; + #endif From patchwork Mon May 4 15:02:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526493 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 CC0A01392 for ; Mon, 4 May 2020 15:05:06 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 800FF206D7 for ; Mon, 4 May 2020 15:05:06 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="B5GJb3Fq" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 800FF206D7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 8C5F58E003E; Mon, 4 May 2020 11:05:05 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 875408E0024; Mon, 4 May 2020 11:05:05 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 78BB58E003E; Mon, 4 May 2020 11:05:05 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 64CEF8E0024 for ; Mon, 4 May 2020 11:05:05 -0400 (EDT) Received: from smtpin29.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 30EFD180AD811 for ; Mon, 4 May 2020 15:05:05 +0000 (UTC) X-FDA: 76779359370.29.tub03_668b8d42fdf2f X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30029:30045:30054:30064:30067,0,RBL:141.146.126.78:@oracle.com:.lbl8.mailshell.net-62.18.0.100 64.10.201.10,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:27,LUA_SUMMARY:none X-HE-Tag: tub03_668b8d42fdf2f X-Filterd-Recvd-Size: 7278 Received: from aserp2120.oracle.com (aserp2120.oracle.com [141.146.126.78]) by imf18.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:05:04 +0000 (UTC) Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044En9lQ024653; Mon, 4 May 2020 15:04:50 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=JmbDddsHqBPfeLl0EGXWiz374Cqp33W511n0wWVb8wQ=; b=B5GJb3FqGk9bP0FA6nIkeLtMd9CDArgqRCnOjmIA9b1lo/V6Hj99FbkHLb99E43PvBAr +ZmaijbdKCOG0ljzZ+OAFdqRu7nUXX3LNUgnNtHx4qY174aWJrchKJ/hl10pH3OS2/aH Iu8XX2RhtVlXCRMBmxp8XrVo+um8om+FFGJteVvIgAvHzZVODewVEy5K+PKCjnDrBF/F E5ewyIGnooxkh60WMltM1To+CnkPkd17cK5GOqOcQKflQYjt0DpdzwrQohTjWa5tbR9N +d6IpU6p49zt+5udYuB751ew2l6BB476hZDd4bpCVc4vPBHEANEmOOpqnQYWQzWvzenK lw== Received: from aserp3030.oracle.com (aserp3030.oracle.com [141.146.126.71]) by aserp2120.oracle.com with ESMTP id 30s0tm7et3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:50 +0000 Received: from pps.filterd (aserp3030.oracle.com [127.0.0.1]) by aserp3030.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044EkeYs094682; Mon, 4 May 2020 15:04:50 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserp3030.oracle.com with ESMTP id 30sjdqqqku-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:50 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id 044F4nc0004501; Mon, 4 May 2020 15:04:49 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:49 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 11/14] asidrv/asicmd: Introduce the asicmd command Date: Mon, 4 May 2020 17:02:32 +0200 Message-Id: <20200504150235.12171-12-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 suspectscore=0 mlxscore=0 bulkscore=0 adultscore=0 phishscore=0 mlxlogscore=999 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 mlxscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 phishscore=0 clxscore=1015 bulkscore=0 mlxlogscore=999 adultscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: The asicmd command is a userland CLI to interact with the ASI driver (asidrv), in particular it provides an interface for running ASI test sequences. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/Makefile | 6 ++ drivers/staging/asi/asicmd.c | 120 +++++++++++++++++++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 drivers/staging/asi/asicmd.c diff --git a/drivers/staging/asi/Makefile b/drivers/staging/asi/Makefile index a48487e48d7c..847d4732c229 100644 --- a/drivers/staging/asi/Makefile +++ b/drivers/staging/asi/Makefile @@ -5,3 +5,9 @@ # obj-m += asi.o asi-y := asidrv.o + +# +# asicmd command +# +hostprogs-y := asicmd +always := $(hostprogs-y) diff --git a/drivers/staging/asi/asicmd.c b/drivers/staging/asi/asicmd.c new file mode 100644 index 000000000000..4d6a347a6d29 --- /dev/null +++ b/drivers/staging/asi/asicmd.c @@ -0,0 +1,120 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2020, Oracle and/or its affiliates. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "asidrv.h" + +struct asidrv_test { + char *name; /* test name */ + enum asidrv_seqnum seqnum; /* sequence */ + bool asi_active; /* ASI active at the end of test? */ + char *desc; /* test description */ +}; + +struct asidrv_test test_list[] = { + { "nop", ASIDRV_SEQ_NOP, true, + "enter/exit ASI and nothing else" }, +}; + +#define TEST_LIST_SIZE (sizeof(test_list) / sizeof(test_list[0])) + +static void usage(void) +{ + int i; + + printf("Usage: asicmd (|...)\n"); + printf("\n"); + printf("Commands:\n"); + printf(" all - run all tests\n"); + printf("\n"); + printf("Tests:\n"); + for (i = 0; i < TEST_LIST_SIZE; i++) + printf(" %-10s - %s\n", test_list[i].name, test_list[i].desc); +} + +static void asidrv_run_test(int fd, struct asidrv_test *test) +{ + struct asidrv_run_param rparam; + int err; + + printf("Test %s (sequence %d)\n", test->name, test->seqnum); + + rparam.sequence = test->seqnum; + + err = ioctl(fd, ASIDRV_IOCTL_RUN_SEQUENCE, &rparam); + + printf(" - rv = %d ; ", err); + if (err < 0) { + printf("error %d\n", errno); + } else { + printf("result = %d ; ", rparam.run_error); + printf("%s\n", + rparam.asi_active ? "asi active" : "asi inactive"); + } + + printf(" - expect = %s\n", + test->asi_active ? "asi active" : "asi inactive"); + + if (err < 0) + printf("ERROR - error %d\n", errno); + else if (rparam.run_error != ASIDRV_RUN_ERR_NONE) + printf("TEST ERROR - error %d\n", rparam.run_error); + else if (test->asi_active != rparam.asi_active) + printf("TEST FAILED - unexpected ASI state\n"); + else + printf("TEST OK\n"); +} + +int main(int argc, char *argv[]) +{ + bool run_all, run; + int i, j, fd; + char *test; + + if (argc <= 1) { + usage(); + return 2; + } + + fd = open("/dev/asi", O_RDONLY); + if (fd == -1) { + perror("open /dev/asi"); + return 1; + } + + for (i = 1; i < argc; i++) { + test = argv[i]; + + if (!strcmp(test, "all")) + run_all = true; + else + run_all = false; + + run = false; + for (j = 0; j < TEST_LIST_SIZE; j++) { + if (run_all || !strcmp(test, test_list[j].name)) { + asidrv_run_test(fd, &test_list[j]); + run = true; + } + } + + if (!run) + printf("Unknown test '%s'\n", test); + } + + close(fd); + + return 0; +} From patchwork Mon May 4 15:02:33 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526495 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 79B001392 for ; Mon, 4 May 2020 15:05:09 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 45F012073B for ; Mon, 4 May 2020 15:05:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="EQUz5wlB" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 45F012073B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 47FBB8E003F; Mon, 4 May 2020 11:05:07 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 430968E0024; Mon, 4 May 2020 11:05:07 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 31FDE8E003F; Mon, 4 May 2020 11:05:07 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0034.hostedemail.com [216.40.44.34]) by kanga.kvack.org (Postfix) with ESMTP id 1B2848E0024 for ; Mon, 4 May 2020 11:05:07 -0400 (EDT) Received: from smtpin21.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id D47D1181AEF3C for ; Mon, 4 May 2020 15:05:06 +0000 (UTC) X-FDA: 76779359412.21.act50_66c5442ab5332 X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30054:30056:30062:30064,0,RBL:156.151.31.85:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:1,LUA_SUMMARY:none X-HE-Tag: act50_66c5442ab5332 X-Filterd-Recvd-Size: 4989 Received: from userp2120.oracle.com (userp2120.oracle.com [156.151.31.85]) by imf05.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:05:06 +0000 (UTC) Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044ElhAv024581; Mon, 4 May 2020 15:04:55 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=t0Jfg7lDKwZXvqE1qLiEmLz1WGtmClHHRzVrFx22SYw=; b=EQUz5wlBjxHzin0fdQMWm/gLowQ2XNmEkmnv0kG6v61Vx/UA8l03x7T8NXYgfqltQL0h G7UKvBCFfdx9GBmEIcRwqykfBQfj+MQIrGjZzdTgYYMpEIFcHO8ppfwx1Vrfyh2Bku2T ZOh/dhDH84LssVuz4kj2OSRr7agAIrZ/68mWqbfKB/F2mf98jKz46lOaP0cQ+FbZgeuc JnXcZIyr4iwKlHhTMXF3D6wlG01LiKiCvl4yEsJ1Q8Qv1/fktoEhYD/GD8fVmIWFlwqY ctum47iV/E7YV5Hx/gusvhXqIw4cXv2zdCHqlBkC2X4NGw/6LxHkvrTDKakTfbPpcUpo /A== Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70]) by userp2120.oracle.com with ESMTP id 30s1gmy9rg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:55 +0000 Received: from pps.filterd (aserp3020.oracle.com [127.0.0.1]) by aserp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044ElNYI034147; Mon, 4 May 2020 15:04:54 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserp3020.oracle.com with ESMTP id 30sjnaws5e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:54 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 044F4rcu028874; Mon, 4 May 2020 15:04:53 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:53 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 12/14] asidrv/asicmd: Add more test sequences for testing ASI Date: Mon, 4 May 2020 17:02:33 +0200 Message-Id: <20200504150235.12171-13-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 mlxscore=0 adultscore=0 phishscore=0 mlxlogscore=999 bulkscore=0 malwarescore=0 spamscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 adultscore=0 suspectscore=0 mlxscore=0 spamscore=0 clxscore=1015 priorityscore=1501 bulkscore=0 phishscore=0 impostorscore=0 malwarescore=0 lowpriorityscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add more options to the asicmd command to test access to map or unmapped memory buffer, interrupt, NMI, scheduling while using ASI. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/asicmd.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/drivers/staging/asi/asicmd.c b/drivers/staging/asi/asicmd.c index 4d6a347a6d29..849fa09423e6 100644 --- a/drivers/staging/asi/asicmd.c +++ b/drivers/staging/asi/asicmd.c @@ -26,6 +26,20 @@ struct asidrv_test { struct asidrv_test test_list[] = { { "nop", ASIDRV_SEQ_NOP, true, "enter/exit ASI and nothing else" }, + { "mem", ASIDRV_SEQ_MEM, false, + "enter ASI and accessed an unmapped buffer" }, + { "memmap", ASIDRV_SEQ_MEMMAP, true, + "enter ASI and accessed a mapped buffer" }, + { "intr", ASIDRV_SEQ_INTERRUPT, true, + "receive an interruption while running with ASI" }, + { "nmi", ASIDRV_SEQ_NMI, true, + "receive a NMI while running with ASI" }, + { "intrnmi", ASIDRV_SEQ_INTRNMI, true, + "receive a NMI in an interrupt received while running with ASI" }, + { "sched", ASIDRV_SEQ_SCHED, true, + "call schedule() while running with ASI" }, + { "printk", ASIDRV_SEQ_PRINTK, true, + "call printk() while running with ASI" }, }; #define TEST_LIST_SIZE (sizeof(test_list) / sizeof(test_list[0])) From patchwork Mon May 4 15:02:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526497 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 EA48014C0 for ; Mon, 4 May 2020 15:05:14 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id B6910206D7 for ; Mon, 4 May 2020 15:05:14 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="a7NeuEIG" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B6910206D7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id EB92C8E0040; Mon, 4 May 2020 11:05:12 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id E69268E0024; Mon, 4 May 2020 11:05:12 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D7E328E0040; Mon, 4 May 2020 11:05:12 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0116.hostedemail.com [216.40.44.116]) by kanga.kvack.org (Postfix) with ESMTP id BDDB98E0024 for ; Mon, 4 May 2020 11:05:12 -0400 (EDT) Received: from smtpin03.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 8AD75181AC9C6 for ; Mon, 4 May 2020 15:05:12 +0000 (UTC) X-FDA: 76779359664.03.shape06_679df44362561 X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30003:30054:30062:30064:30070:30089,0,RBL:141.146.126.78:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:26,LUA_SUMMARY:none X-HE-Tag: shape06_679df44362561 X-Filterd-Recvd-Size: 6471 Received: from aserp2120.oracle.com (aserp2120.oracle.com [141.146.126.78]) by imf14.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:05:11 +0000 (UTC) Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044En9Cd024665; Mon, 4 May 2020 15:04:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=9e36+98PNoowCUHFPdVfiZTA22EJNaHCMNF8Hj+ZaN8=; b=a7NeuEIG5wIhjV7s42Ng1bXBB4WfyQL2JTHR26de2E7aeI+r7+xRe6P1mOq7cQ1g9YRx 0THsLrZIdYzOXzJurJng8KPG9xCd5/ATvZTZzTPDjCiGWXKngKLfSspkGgqcnmaBUlNk UinL0di9n6odc5suJ6dQBkC7FeW22B74Yev8R1IZPeXrZnuPQykxAbyiCKDeH7ghndpU V7vrjvu7ibmv8vOCT1QqJiq3M2ojyyKi42ZR/z6CNXeo7yO3WgmrZNzSbE/6geuc/oOB BEdCLwEeeHV/sCCTj52hIonQ6P7ttbh4Gy4XC17aKRxJ7eh0bcgaKZPS6StcqnDYkQC6 bQ== Received: from userp3020.oracle.com (userp3020.oracle.com [156.151.31.79]) by aserp2120.oracle.com with ESMTP id 30s0tm7euh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:59 +0000 Received: from pps.filterd (userp3020.oracle.com [127.0.0.1]) by userp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044EmVcH105622; Mon, 4 May 2020 15:04:59 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by userp3020.oracle.com with ESMTP id 30sjjw19k9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:04:59 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 044F4vNG030629; Mon, 4 May 2020 15:04:57 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:04:57 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 13/14] asidrv/asicmd: Add options to manage ASI page faults Date: Mon, 4 May 2020 17:02:34 +0200 Message-Id: <20200504150235.12171-14-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 mlxscore=0 phishscore=0 bulkscore=0 malwarescore=0 spamscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 malwarescore=0 mlxscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 phishscore=0 clxscore=1015 bulkscore=0 mlxlogscore=999 adultscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add options to the asicmd CLI to list and clear ASI page faults. Also add an option to enable/disable displaying stack trace on ASI page fault. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/asicmd.c | 68 ++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/drivers/staging/asi/asicmd.c b/drivers/staging/asi/asicmd.c index 849fa09423e6..4d7bb9df0fcc 100644 --- a/drivers/staging/asi/asicmd.c +++ b/drivers/staging/asi/asicmd.c @@ -52,6 +52,10 @@ static void usage(void) printf("\n"); printf("Commands:\n"); printf(" all - run all tests\n"); + printf(" fault - list ASI faults\n"); + printf(" fltclr - clear ASI faults\n"); + printf(" stkon - show stack on ASI fault\n"); + printf(" stkoff - do not show stack on ASI fault\n"); printf("\n"); printf("Tests:\n"); for (i = 0; i < TEST_LIST_SIZE; i++) @@ -91,10 +95,45 @@ static void asidrv_run_test(int fd, struct asidrv_test *test) printf("TEST OK\n"); } +static int asidrv_fault_list(int fd) +{ + struct asidrv_fault_list *flist; + int i, rv; + + flist = malloc(sizeof(*flist) + + sizeof(struct asidrv_fault) * 10); + if (!flist) { + perror("malloc flist"); + return -1; + } + + flist->length = 10; + rv = ioctl(fd, ASIDRV_IOCTL_LIST_FAULT, flist); + if (rv < 0) { + perror("ioctl list fault"); + return -1; + } + + if (!flist->length) { + printf("ASI has no fault\n"); + return 0; + } + + printf("%-18s %5s %s\n", "ADDRESS", "COUNT", "SYMBOL"); + for (i = 0; i < flist->length && i < 10; i++) { + printf("%#18llx %5u %s\n", + flist->fault[i].addr, + flist->fault[i].count, + flist->fault[i].symbol); + } + + return 0; +} + int main(int argc, char *argv[]) { bool run_all, run; - int i, j, fd; + int i, j, fd, err; char *test; if (argc <= 1) { @@ -111,10 +150,33 @@ int main(int argc, char *argv[]) for (i = 1; i < argc; i++) { test = argv[i]; - if (!strcmp(test, "all")) + if (!strcmp(test, "fault")) { + asidrv_fault_list(fd); + continue; + + } else if (!strcmp(test, "fltclr")) { + err = ioctl(fd, ASIDRV_IOCTL_CLEAR_FAULT); + if (err) + perror("ioctl clear fault"); + continue; + + } else if (!strcmp(test, "stkon")) { + err = ioctl(fd, ASIDRV_IOCTL_LOG_FAULT_STACK, true); + if (err) + perror("ioctl log fault stack"); + continue; + + } else if (!strcmp(test, "stkoff")) { + err = ioctl(fd, ASIDRV_IOCTL_LOG_FAULT_STACK, false); + if (err) + perror("ioctl log fault sstack"); + continue; + + } else if (!strcmp(test, "all")) { run_all = true; - else + } else { run_all = false; + } run = false; for (j = 0; j < TEST_LIST_SIZE; j++) { From patchwork Mon May 4 15:02:35 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexandre Chartre X-Patchwork-Id: 11526499 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 C0DB914C0 for ; Mon, 4 May 2020 15:05:22 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 7CEC2206D7 for ; Mon, 4 May 2020 15:05:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="FyGhYMm8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7CEC2206D7 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id E1C718E0041; Mon, 4 May 2020 11:05:20 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id DCC248E0024; Mon, 4 May 2020 11:05:20 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id CBFFD8E0041; Mon, 4 May 2020 11:05:20 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0047.hostedemail.com [216.40.44.47]) by kanga.kvack.org (Postfix) with ESMTP id B31B38E0024 for ; Mon, 4 May 2020 11:05:20 -0400 (EDT) Received: from smtpin10.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay05.hostedemail.com (Postfix) with ESMTP id 76808181AEF32 for ; Mon, 4 May 2020 15:05:20 +0000 (UTC) X-FDA: 76779360000.10.view55_68c79f1abd103 X-Spam-Summary: 1,0,0,,d41d8cd98f00b204,alexandre.chartre@oracle.com,,RULES_HIT:30003:30029:30054:30062:30064:30070,0,RBL:156.151.31.86:@oracle.com:.lbl8.mailshell.net-64.10.201.10 62.18.0.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:ft,MSBL:0,DNSBL:neutral,Custom_rules:0:0:0,LFtime:23,LUA_SUMMARY:none X-HE-Tag: view55_68c79f1abd103 X-Filterd-Recvd-Size: 10215 Received: from userp2130.oracle.com (userp2130.oracle.com [156.151.31.86]) by imf13.hostedemail.com (Postfix) with ESMTP for ; Mon, 4 May 2020 15:05:19 +0000 (UTC) Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044ElbOC116459; Mon, 4 May 2020 15:05:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references; s=corp-2020-01-29; bh=HpLop/q6lU72RED2M2+GV24t44M/xn1HonNpo3nMWgU=; b=FyGhYMm8VAft9HHCv0GOjD0jRw7lTwOx0r+xP7qPCr1zVyHsNwtDMFSSGUj/xLBHVsNa RC3IQtUYa646xMlbSozveJI/Jx5A7lIFn9dHnzm20i916PMMA+47ILesv3oV/gJKn/9V bCpiHn6JIF2D7x34SXOuY7gZtTzzjXxSlLP0NmvXrBHta/9mleqwO0vmp519mffuwxsG yah9mPj0rq3NXoP3cuw2q3W91aZxqxzN8FpX8PpAXsvS3v2Xly4RbngLuE3bKY5OaPM2 SjVcbYT5jBd/jog3TpJQPJe6+GTrTE+DOSIQr0gC2c0Ytf1BpuD8KzKM+Quk+Dwwp6wm rw== Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by userp2130.oracle.com with ESMTP id 30s09qyh0x-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:05:03 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 044ElaIM053343; Mon, 4 May 2020 15:05:03 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userp3030.oracle.com with ESMTP id 30t1r2f99h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 04 May 2020 15:05:03 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id 044F51Zt028984; Mon, 4 May 2020 15:05:01 GMT Received: from linux-1.home.com (/10.175.9.166) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 04 May 2020 08:05:01 -0700 From: Alexandre Chartre To: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, dave.hansen@linux.intel.com, luto@kernel.org, peterz@infradead.org, x86@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org Cc: pbonzini@redhat.com, konrad.wilk@oracle.com, jan.setjeeilers@oracle.com, liran.alon@oracle.com, junaids@google.com, graf@amazon.de, rppt@linux.vnet.ibm.com, kuzuno@gmail.com, mgross@linux.intel.com, alexandre.chartre@oracle.com Subject: [RFC v4][PATCH part-3 14/14] asidrv/asicmd: Add options to manage ASI mapped VA ranges Date: Mon, 4 May 2020 17:02:35 +0200 Message-Id: <20200504150235.12171-15-alexandre.chartre@oracle.com> X-Mailer: git-send-email 2.18.2 In-Reply-To: <20200504150235.12171-1-alexandre.chartre@oracle.com> References: <20200504150235.12171-1-alexandre.chartre@oracle.com> X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 adultscore=0 suspectscore=2 spamscore=0 mlxlogscore=999 malwarescore=0 phishscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9610 signatures=668687 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 bulkscore=0 mlxscore=0 lowpriorityscore=0 spamscore=0 adultscore=0 clxscore=1015 suspectscore=2 priorityscore=1501 malwarescore=0 mlxlogscore=999 phishscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2003020000 definitions=main-2005040123 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Add options to the asicmd CLI to list, add and clear ASI mapped VA ranges. Signed-off-by: Alexandre Chartre --- drivers/staging/asi/asicmd.c | 243 +++++++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) diff --git a/drivers/staging/asi/asicmd.c b/drivers/staging/asi/asicmd.c index 4d7bb9df0fcc..974a3147a313 100644 --- a/drivers/staging/asi/asicmd.c +++ b/drivers/staging/asi/asicmd.c @@ -16,6 +16,10 @@ #include "asidrv.h" +static const char * const page_table_level[] = { + "PTE", "PMD", "PUD", "P4D", "PGD" +}; + struct asidrv_test { char *name; /* test name */ enum asidrv_seqnum seqnum; /* sequence */ @@ -56,12 +60,25 @@ static void usage(void) printf(" fltclr - clear ASI faults\n"); printf(" stkon - show stack on ASI fault\n"); printf(" stkoff - do not show stack on ASI fault\n"); + printf(" map - list ASI mappings\n"); + printf(" mapadd - add ASI mappings\n"); + printf(" mapclr - clear ASI mapping\n"); printf("\n"); printf("Tests:\n"); for (i = 0; i < TEST_LIST_SIZE; i++) printf(" %-10s - %s\n", test_list[i].name, test_list[i].desc); } +static void usage_mapadd(void) +{ + printf("usage: asicmd mapadd [percpu:]:[:]\n"); +} + +static void usage_mapclr(void) +{ + printf("usage: asicmd mapclr [percpu:]\n"); +} + static void asidrv_run_test(int fd, struct asidrv_test *test) { struct asidrv_run_param rparam; @@ -130,6 +147,210 @@ static int asidrv_fault_list(int fd) return 0; } +static int asidrv_map_list(int fd) +{ + struct asidrv_mapping_list *mlist; + int level; + int i, rv, len = 64; + + mlist = malloc(sizeof(*mlist) + + sizeof(struct asidrv_mapping) * len); + if (!mlist) { + perror("malloc mlist"); + return -1; + } + + mlist->length = len; + rv = ioctl(fd, ASIDRV_IOCTL_LIST_MAPPING, mlist); + if (rv < 0) { + perror("ioctl list mapping"); + return -1; + } + + if (!mlist->length) { + printf("ASI has no mapping\n"); + return 0; + } + + printf("%-18s %18s %s\n", "ADDRESS", "SIZE", "LEVEL"); + for (i = 0; i < mlist->length && i < len; i++) { + printf("%#18llx %#18llx ", + mlist->mapping[i].addr, + mlist->mapping[i].size); + level = mlist->mapping[i].level; + if (level < 5) + printf("%5s\n", page_table_level[level]); + else + printf("%5d\n", level); + } + printf("Mapping List: %d/%d\n", i, mlist->length); + + return 0; +} + +static char *asidrv_skip_percpu(char *str, bool *percpup) +{ + int len = sizeof("percpu:") - 1; + + if (!strncmp(str, "percpu:", len)) { + str += len; + *percpup = true; + } else { + *percpup = false; + } + + return str; +} + +static int asidrv_parse_mapping_clear(char *arg, struct asidrv_mapping *mapping) +{ + char *s, *end; + bool percpu; + __u64 addr; + + s = asidrv_skip_percpu(arg, &percpu); + + addr = strtoull(s, &end, 0); + if (*end != 0) { + printf("invalid mapping address '%s'\n", s); + return -1; + } + + printf("mapclr %llx%s\n", addr, percpu ? " percpu" : ""); + + mapping->addr = addr; + mapping->size = 0; + mapping->level = 0; + mapping->percpu = percpu; + + return 0; +} + +static int asidrv_parse_mapping_add(char *arg, struct asidrv_mapping *mapping) +{ + char *s, *end; + __u64 addr, size; + __u32 level; + bool percpu; + int i; + + s = asidrv_skip_percpu(arg, &percpu); + + s = strtok(s, ":"); + if (!s) { + printf("mapadd: not found\n"); + return -1; + } + + addr = strtoull(s, &end, 0); + if (*end != 0) { + printf("invalid mapping address '%s'\n", s); + return -1; + } + + s = strtok(NULL, ":"); + if (!s) { + printf("mapadd: not found\n"); + return -1; + } + size = strtoull(s, &end, 0); + if (*end != 0) { + printf("mapadd: invalid size %s\n", s); + return -1; + } + + s = strtok(NULL, ":"); + if (!s) { + level = 0; + } else { + /* lookup page table level name */ + level = -1; + for (i = 0; i < 5; i++) { + if (!strcasecmp(s, page_table_level[i])) { + level = i; + break; + } + } + if (level == -1) { + level = strtoul(s, &end, 0); + if (*end != 0 || level >= 5) { + printf("mapadd: invalid level %s\n", s); + return -1; + } + } + } + + printf("mapadd %llx/%llx/%u%s\n", addr, size, level, + percpu ? " percpu" : ""); + + mapping->addr = addr; + mapping->size = size; + mapping->level = level; + mapping->percpu = percpu; + + return 0; +} + +static int asidrv_map_change(int fd, unsigned long cmd, char *arg) +{ + struct asidrv_mapping_list *mlist; + int i, count, err; + char *s; + + count = 0; + for (s = arg; s; s = strchr(s + 1, ',')) + count++; + + mlist = malloc(sizeof(mlist) + sizeof(struct asidrv_mapping) * count); + if (!mlist) { + perror("malloc mapping list"); + return -ENOMEM; + } + + for (i = 0; i < count; i++) { + s = strchr(arg, ','); + if (s) + s[0] = '\0'; + + if (cmd == ASIDRV_IOCTL_ADD_MAPPING) { + err = asidrv_parse_mapping_add(arg, + &mlist->mapping[i]); + } else { + err = asidrv_parse_mapping_clear(arg, + &mlist->mapping[i]); + } + if (err) + goto done; + arg = s + 1; + } + + mlist->length = count; + err = ioctl(fd, cmd, mlist); + if (err < 0) { + perror("ioctl mapping"); + err = errno; + } else if (err > 0) { + /* partial error */ + printf("ioctl mapping: partial failure (%d/%d)\n", + err, count); + for (i = 0; i < count; i++) { + printf(" %#llx: ", mlist->mapping[i].addr); + if (i < err) + printf("done\n"); + else if (i == err) + printf("failed\n"); + else + printf("not done\n"); + } + err = -1; + } + +done: + free(mlist); + + return err; +} + int main(int argc, char *argv[]) { bool run_all, run; @@ -172,6 +393,28 @@ int main(int argc, char *argv[]) perror("ioctl log fault sstack"); continue; + } else if (!strcmp(test, "map")) { + asidrv_map_list(fd); + continue; + + } else if (!strcmp(test, "mapadd")) { + if (++i >= argc) { + usage_mapadd(); + return 2; + } + asidrv_map_change(fd, ASIDRV_IOCTL_ADD_MAPPING, + argv[i]); + continue; + + } else if (!strcmp(test, "mapclr")) { + if (++i >= argc) { + usage_mapclr(); + return 2; + } + asidrv_map_change(fd, ASIDRV_IOCTL_CLEAR_MAPPING, + argv[i]); + continue; + } else if (!strcmp(test, "all")) { run_all = true; } else {