From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Cyrus-Session-Id: sloti22d1t05-1164045-1517178519-2-17627400391680612417 X-Sieve: CMU Sieve 3.0 X-Spam-known-sender: no X-Spam-score: 0.0 X-Spam-hits: BAYES_00 -1.9, HEADER_FROM_DIFFERENT_DOMAINS 0.001, RCVD_IN_DNSWL_HI -5, T_RP_MATCHES_RCVD -0.01, LANGUAGES en, BAYES_USED global, SA_VERSION 3.4.0 X-Spam-source: IP='209.132.180.67', Host='vger.kernel.org', Country='US', FromHeader='com', MailFrom='org', XOriginatingCountry='US' X-Spam-charsets: plain='iso-8859-1' X-Resolved-to: greg@kroah.com X-Delivered-to: greg@kroah.com X-Mail-from: stable-owner@vger.kernel.org ARC-Seal: i=1; a=rsa-sha256; cv=none; d=messagingengine.com; s=arctest; t=1517178518; b=oZrlDeqKPpqeSHgK/ZJm5IcaOd/2WJ0pbvwMv4mPCHLPK9N aFeM9oRmsjr31Dv4gTS5SoSGivm32VLpsFjTgQl+P3EfHzhlyqIc28Chb3DICdWW WsE51Oro1V+iZWzzci++0eVm+3NIRv3ii6MPJKfA16DuJOB3v8M0u/Ez5ctjKKPn 5vvFpTIZ3kRoJQzuQZiOdff8aoBVPfQhND7Orn+50dzf8pmipVUY2biuAzHsUmX1 HfEjn7eWweZalE1+B+ake81fpfB8o/2Hcm7xIw+bj9WwpYFcucIS+vUKvoZztwJz pNc8W9iuwNiZrVWwMI1H7oF3gkHHDpdgXS8HWsg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=from:to:cc:subject:date:message-id :references:in-reply-to:content-type:content-transfer-encoding :mime-version:sender:list-id; s=arctest; t=1517178518; bh=CHVEvg ZlCcTGL6piy8c7tYk/jOWyw48Hm5kxbNIMlMU=; b=Eeazxz7ZyXXvJ28wE5bDwu +FbbycfA+se7bsnMw1rvjOzR78EEfgoEYfbBdnoml6cZ0TZwa24Vq6sFh7Vna7HM sHR/yfjBLyVzLA5/l6yIj7bzN0WM29QwfuGzd2rTxwmmF5u3AoHh9OtYpYViOpnD jR9dH2hrw/ntvxsgPE2IOaI1/HxW11wp//0VGZrUMgqRH5TPWXXQ9sUbHVF+7m0T Q5cMC3EKRmB+BHvis/kCTRMnbdCXhJ8xKS+1XgJKZ3xwOLvJg76oZ0krOPkA3N7B +bEwWoSpEUHL4D6Ij3vzPcE810m4zEQjulWIlb9ajK2Vz4z1zjIUJlwCjgTuLQZA == ARC-Authentication-Results: i=1; mx4.messagingengine.com; arc=none (no signatures found); dkim=pass (1024-bit rsa key sha256) header.d=microsoft.com header.i=@microsoft.com header.b=YXvsb3T3 x-bits=1024 x-keytype=rsa x-algorithm=sha256 x-selector=selector1; dmarc=pass (p=reject,has-list-id=yes,d=none) header.from=microsoft.com; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=stable-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=microsoft.com header.result=pass header_is_org_domain=yes Authentication-Results: mx4.messagingengine.com; arc=none (no signatures found); dkim=pass (1024-bit rsa key sha256) header.d=microsoft.com header.i=@microsoft.com header.b=YXvsb3T3 x-bits=1024 x-keytype=rsa x-algorithm=sha256 x-selector=selector1; dmarc=pass (p=reject,has-list-id=yes,d=none) header.from=microsoft.com; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=stable-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=microsoft.com header.result=pass header_is_org_domain=yes Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932081AbeA1W2g (ORCPT ); Sun, 28 Jan 2018 17:28:36 -0500 Received: from mail-by2nam03on0130.outbound.protection.outlook.com ([104.47.42.130]:20166 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1753678AbeA1W2X (ORCPT ); Sun, 28 Jan 2018 17:28:23 -0500 From: Sasha Levin To: "linux-kernel@vger.kernel.org" , "stable@vger.kernel.org" CC: Karol Herbst , Linus Torvalds , Peter Zijlstra , Steven Rostedt , Thomas Gleixner , "nouveau@lists.freedesktop.org" , Ingo Molnar , Sasha Levin Subject: [PATCH AUTOSEL for 4.14 095/100] x86/mm/kmmio: Fix mmiotrace for page unaligned addresses Thread-Topic: [PATCH AUTOSEL for 4.14 095/100] x86/mm/kmmio: Fix mmiotrace for page unaligned addresses Thread-Index: AQHTmIcemLt8LKWIYk2S6V2aiLQH8A== Date: Sun, 28 Jan 2018 22:27:02 +0000 Message-ID: <20180128222547.7398-95-alexander.levin@microsoft.com> References: <20180128222547.7398-1-alexander.levin@microsoft.com> In-Reply-To: <20180128222547.7398-1-alexander.levin@microsoft.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [52.168.54.252] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1;MW2PR2101MB1017;7:r7NDIFL4BreQLUzH3EBrW2+EaSttL6BBwwZXlMn7KggR33cu5O+UR9KJpi9QMtzSFyQKq0Bj47sglok0vZDpCWry/t2gO9sfpoxPyazFE6PGbEUr5kuigdRGGRcJl8JzrrmSgb+wXcvavbRg6Kx1UO+5xr60UeIB1oC/lgPm5A9wlLGxgsDIw7X489snuHZi04jUlXnr+TKa1BSefS9wpSTYiVcbTW+QFfnoENP3rpMATvKGFs1IqqN42PYg+qhX x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: 7d2d42ae-2f10-4ea8-bc5b-08d5669e6e1b x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(48565401081)(5600026)(4604075)(3008032)(2017052603307)(7193020);SRVR:MW2PR2101MB1017; x-ms-traffictypediagnostic: MW2PR2101MB1017: authentication-results: spf=none (sender IP is ) smtp.mailfrom=Alexander.Levin@microsoft.com; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(28532068793085)(89211679590171)(85827821059158)(217544274631240)(42068640409301); x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(61425038)(6040501)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3231101)(944501161)(3002001)(6055026)(61426038)(61427038)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123558120)(20161123560045)(20161123564045)(6072148)(201708071742011);SRVR:MW2PR2101MB1017;BCL:0;PCL:0;RULEID:;SRVR:MW2PR2101MB1017; x-forefront-prvs: 05669A7924 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(396003)(39860400002)(39380400002)(366004)(346002)(376002)(189003)(199004)(59450400001)(81156014)(6666003)(305945005)(2900100001)(76176011)(68736007)(86612001)(3660700001)(8676002)(3280700002)(6506007)(102836004)(6116002)(105586002)(7736002)(2950100002)(3846002)(1076002)(106356001)(36756003)(5660300001)(2906002)(8936002)(66066001)(10090500001)(6486002)(6512007)(25786009)(53936002)(186003)(316002)(6436002)(86362001)(575784001)(14454004)(478600001)(6306002)(2501003)(966005)(5250100002)(72206003)(99286004)(97736004)(107886003)(4326008)(54906003)(81166006)(110136005)(26005)(10290500003)(22452003)(22906009)(217873001);DIR:OUT;SFP:1102;SCL:1;SRVR:MW2PR2101MB1017;H:MW2PR2101MB1034.namprd21.prod.outlook.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; x-microsoft-antispam-message-info: MCCFjbtogR2WRggJ5P3WW7khZdsgi/mGjJOoM+7Ug/ZO4UGBaZvDwuV1I0SUQbP6/oJm/Jzo3OyNFu7xdTcL4w== spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7d2d42ae-2f10-4ea8-bc5b-08d5669e6e1b X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Jan 2018 22:27:02.5433 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW2PR2101MB1017 Sender: stable-owner@vger.kernel.org X-Mailing-List: stable@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-Mailing-List: linux-kernel@vger.kernel.org List-ID: From: Karol Herbst [ Upstream commit 6d60ce384d1d5ca32b595244db4077a419acc687 ] If something calls ioremap() with an address not aligned to PAGE_SIZE, the returned address might be not aligned as well. This led to a probe registered on exactly the returned address, but the entire page was armed for mmiotracing. On calling iounmap() the address passed to unregister_kmmio_probe() was PAGE_SIZE aligned by the caller leading to a complete freeze of the machine. We should always page align addresses while (un)registerung mappings, because the mmiotracer works on top of pages, not mappings. We still keep track of the probes based on their real addresses and lengths though, because the mmiotrace still needs to know what are mapped memory regions. Also move the call to mmiotrace_iounmap() prior page aligning the address, so that all probes are unregistered properly, otherwise the kernel ends up failing memory allocations randomly after disabling the mmiotracer. Tested-by: Lyude Signed-off-by: Karol Herbst Acked-by: Pekka Paalanen Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Steven Rostedt Cc: Thomas Gleixner Cc: nouveau@lists.freedesktop.org Link: http://lkml.kernel.org/r/20171127075139.4928-1-kherbst@redhat.com Signed-off-by: Ingo Molnar Signed-off-by: Sasha Levin --- arch/x86/mm/ioremap.c | 4 ++-- arch/x86/mm/kmmio.c | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 34f0e1847dd6..5d4c358778dd 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -349,11 +349,11 @@ void iounmap(volatile void __iomem *addr) return; } =20 + mmiotrace_iounmap(addr); + addr =3D (volatile void __iomem *) (PAGE_MASK & (unsigned long __force)addr); =20 - mmiotrace_iounmap(addr); - /* Use the vm area unlocked, assuming the caller ensures there isn't another iounmap for the same address in parallel. Reuse of the virtual address is prevented by diff --git a/arch/x86/mm/kmmio.c b/arch/x86/mm/kmmio.c index c21c2ed04612..58477ec3d66d 100644 --- a/arch/x86/mm/kmmio.c +++ b/arch/x86/mm/kmmio.c @@ -435,17 +435,18 @@ int register_kmmio_probe(struct kmmio_probe *p) unsigned long flags; int ret =3D 0; unsigned long size =3D 0; + unsigned long addr =3D p->addr & PAGE_MASK; const unsigned long size_lim =3D p->len + (p->addr & ~PAGE_MASK); unsigned int l; pte_t *pte; =20 spin_lock_irqsave(&kmmio_lock, flags); - if (get_kmmio_probe(p->addr)) { + if (get_kmmio_probe(addr)) { ret =3D -EEXIST; goto out; } =20 - pte =3D lookup_address(p->addr, &l); + pte =3D lookup_address(addr, &l); if (!pte) { ret =3D -EINVAL; goto out; @@ -454,7 +455,7 @@ int register_kmmio_probe(struct kmmio_probe *p) kmmio_count++; list_add_rcu(&p->list, &kmmio_probes); while (size < size_lim) { - if (add_kmmio_fault_page(p->addr + size)) + if (add_kmmio_fault_page(addr + size)) pr_err("Unable to set page fault.\n"); size +=3D page_level_size(l); } @@ -528,19 +529,20 @@ void unregister_kmmio_probe(struct kmmio_probe *p) { unsigned long flags; unsigned long size =3D 0; + unsigned long addr =3D p->addr & PAGE_MASK; const unsigned long size_lim =3D p->len + (p->addr & ~PAGE_MASK); struct kmmio_fault_page *release_list =3D NULL; struct kmmio_delayed_release *drelease; unsigned int l; pte_t *pte; =20 - pte =3D lookup_address(p->addr, &l); + pte =3D lookup_address(addr, &l); if (!pte) return; =20 spin_lock_irqsave(&kmmio_lock, flags); while (size < size_lim) { - release_kmmio_fault_page(p->addr + size, &release_list); + release_kmmio_fault_page(addr + size, &release_list); size +=3D page_level_size(l); } list_del_rcu(&p->list); --=20 2.11.0