From mboxrd@z Thu Jan 1 00:00:00 1970 From: Greg Kroah-Hartman Subject: [PATCH 4.14 148/159] x86/mm/kmmio: Fix mmiotrace for page unaligned addresses Date: Fri, 23 Feb 2018 19:27:36 +0100 Message-ID: <20180223170800.883691621@linuxfoundation.org> References: <20180223170743.086611315@linuxfoundation.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180223170743.086611315-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Cc: Peter Zijlstra , Greg Kroah-Hartman , stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Sasha Levin , Pekka Paalanen , Steven Rostedt , nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Thomas Gleixner , Linus Torvalds , Ingo Molnar List-Id: nouveau.vger.kernel.org NC4xNC1zdGFibGUgcmV2aWV3IHBhdGNoLiAgSWYgYW55b25lIGhhcyBhbnkgb2JqZWN0aW9ucywg cGxlYXNlIGxldCBtZSBrbm93LgoKLS0tLS0tLS0tLS0tLS0tLS0tCgpGcm9tOiBLYXJvbCBIZXJi c3QgPGtoZXJic3RAcmVkaGF0LmNvbT4KCgpbIFVwc3RyZWFtIGNvbW1pdCA2ZDYwY2UzODRkMWQ1 Y2EzMmI1OTUyNDRkYjQwNzdhNDE5YWNjNjg3IF0KCklmIHNvbWV0aGluZyBjYWxscyBpb3JlbWFw KCkgd2l0aCBhbiBhZGRyZXNzIG5vdCBhbGlnbmVkIHRvIFBBR0VfU0laRSwgdGhlCnJldHVybmVk IGFkZHJlc3MgbWlnaHQgYmUgbm90IGFsaWduZWQgYXMgd2VsbC4gVGhpcyBsZWQgdG8gYSBwcm9i ZQpyZWdpc3RlcmVkIG9uIGV4YWN0bHkgdGhlIHJldHVybmVkIGFkZHJlc3MsIGJ1dCB0aGUgZW50 aXJlIHBhZ2Ugd2FzIGFybWVkCmZvciBtbWlvdHJhY2luZy4KCk9uIGNhbGxpbmcgaW91bm1hcCgp IHRoZSBhZGRyZXNzIHBhc3NlZCB0byB1bnJlZ2lzdGVyX2ttbWlvX3Byb2JlKCkgd2FzClBBR0Vf U0laRSBhbGlnbmVkIGJ5IHRoZSBjYWxsZXIgbGVhZGluZyB0byBhIGNvbXBsZXRlIGZyZWV6ZSBv ZiB0aGUKbWFjaGluZS4KCldlIHNob3VsZCBhbHdheXMgcGFnZSBhbGlnbiBhZGRyZXNzZXMgd2hp bGUgKHVuKXJlZ2lzdGVydW5nIG1hcHBpbmdzLApiZWNhdXNlIHRoZSBtbWlvdHJhY2VyIHdvcmtz IG9uIHRvcCBvZiBwYWdlcywgbm90IG1hcHBpbmdzLiBXZSBzdGlsbCBrZWVwCnRyYWNrIG9mIHRo ZSBwcm9iZXMgYmFzZWQgb24gdGhlaXIgcmVhbCBhZGRyZXNzZXMgYW5kIGxlbmd0aHMgdGhvdWdo LApiZWNhdXNlIHRoZSBtbWlvdHJhY2Ugc3RpbGwgbmVlZHMgdG8ga25vdyB3aGF0IGFyZSBtYXBw ZWQgbWVtb3J5IHJlZ2lvbnMuCgpBbHNvIG1vdmUgdGhlIGNhbGwgdG8gbW1pb3RyYWNlX2lvdW5t YXAoKSBwcmlvciBwYWdlIGFsaWduaW5nIHRoZSBhZGRyZXNzLApzbyB0aGF0IGFsbCBwcm9iZXMg YXJlIHVucmVnaXN0ZXJlZCBwcm9wZXJseSwgb3RoZXJ3aXNlIHRoZSBrZXJuZWwgZW5kcyB1cApm YWlsaW5nIG1lbW9yeSBhbGxvY2F0aW9ucyByYW5kb21seSBhZnRlciBkaXNhYmxpbmcgdGhlIG1t aW90cmFjZXIuCgpUZXN0ZWQtYnk6IEx5dWRlIDxseXVkZUByZWRoYXQuY29tPgpTaWduZWQtb2Zm LWJ5OiBLYXJvbCBIZXJic3QgPGtoZXJic3RAcmVkaGF0LmNvbT4KQWNrZWQtYnk6IFBla2thIFBh YWxhbmVuIDxwcGFhbGFuZW5AZ21haWwuY29tPgpDYzogTGludXMgVG9ydmFsZHMgPHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnPgpDYzogUGV0ZXIgWmlqbHN0cmEgPHBldGVyekBpbmZyYWRl YWQub3JnPgpDYzogU3RldmVuIFJvc3RlZHQgPHJvc3RlZHRAZ29vZG1pcy5vcmc+CkNjOiBUaG9t YXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KQ2M6IG5vdXZlYXVAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCkxpbms6IGh0dHA6Ly9sa21sLmtlcm5lbC5vcmcvci8yMDE3MTEyNzA3NTEzOS40 OTI4LTEta2hlcmJzdEByZWRoYXQuY29tClNpZ25lZC1vZmYtYnk6IEluZ28gTW9sbmFyIDxtaW5n b0BrZXJuZWwub3JnPgpTaWduZWQtb2ZmLWJ5OiBTYXNoYSBMZXZpbiA8YWxleGFuZGVyLmxldmlu QHZlcml6b24uY29tPgpTaWduZWQtb2ZmLWJ5OiBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBs aW51eGZvdW5kYXRpb24ub3JnPgotLS0KIGFyY2gveDg2L21tL2lvcmVtYXAuYyB8ICAgIDQgKyst LQogYXJjaC94ODYvbW0va21taW8uYyAgIHwgICAxMiArKysrKysrLS0tLS0KIDIgZmlsZXMgY2hh bmdlZCwgOSBpbnNlcnRpb25zKCspLCA3IGRlbGV0aW9ucygtKQoKLS0tIGEvYXJjaC94ODYvbW0v aW9yZW1hcC5jCisrKyBiL2FyY2gveDg2L21tL2lvcmVtYXAuYwpAQCAtMzQ5LDExICszNDksMTEg QEAgdm9pZCBpb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcgogCQlyZXR1cm47CiAJ fQogCisJbW1pb3RyYWNlX2lvdW5tYXAoYWRkcik7CisKIAlhZGRyID0gKHZvbGF0aWxlIHZvaWQg X19pb21lbSAqKQogCQkoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyKTsK IAotCW1taW90cmFjZV9pb3VubWFwKGFkZHIpOwotCiAJLyogVXNlIHRoZSB2bSBhcmVhIHVubG9j a2VkLCBhc3N1bWluZyB0aGUgY2FsbGVyCiAJICAgZW5zdXJlcyB0aGVyZSBpc24ndCBhbm90aGVy IGlvdW5tYXAgZm9yIHRoZSBzYW1lIGFkZHJlc3MKIAkgICBpbiBwYXJhbGxlbC4gUmV1c2Ugb2Yg dGhlIHZpcnR1YWwgYWRkcmVzcyBpcyBwcmV2ZW50ZWQgYnkKLS0tIGEvYXJjaC94ODYvbW0va21t aW8uYworKysgYi9hcmNoL3g4Ni9tbS9rbW1pby5jCkBAIC00MzUsMTcgKzQzNSwxOCBAQCBpbnQg cmVnaXN0ZXJfa21taW9fcHJvYmUoc3RydWN0IGttbWlvX3ByCiAJdW5zaWduZWQgbG9uZyBmbGFn czsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIHNpemUgPSAwOworCXVuc2lnbmVkIGxv bmcgYWRkciA9IHAtPmFkZHIgJiBQQUdFX01BU0s7CiAJY29uc3QgdW5zaWduZWQgbG9uZyBzaXpl X2xpbSA9IHAtPmxlbiArIChwLT5hZGRyICYgflBBR0VfTUFTSyk7CiAJdW5zaWduZWQgaW50IGw7 CiAJcHRlX3QgKnB0ZTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZrbW1pb19sb2NrLCBmbGFncyk7 Ci0JaWYgKGdldF9rbW1pb19wcm9iZShwLT5hZGRyKSkgeworCWlmIChnZXRfa21taW9fcHJvYmUo YWRkcikpIHsKIAkJcmV0ID0gLUVFWElTVDsKIAkJZ290byBvdXQ7CiAJfQogCi0JcHRlID0gbG9v a3VwX2FkZHJlc3MocC0+YWRkciwgJmwpOworCXB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHIsICZs KTsKIAlpZiAoIXB0ZSkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTQ1NCw3 ICs0NTUsNyBAQCBpbnQgcmVnaXN0ZXJfa21taW9fcHJvYmUoc3RydWN0IGttbWlvX3ByCiAJa21t aW9fY291bnQrKzsKIAlsaXN0X2FkZF9yY3UoJnAtPmxpc3QsICZrbW1pb19wcm9iZXMpOwogCXdo aWxlIChzaXplIDwgc2l6ZV9saW0pIHsKLQkJaWYgKGFkZF9rbW1pb19mYXVsdF9wYWdlKHAtPmFk ZHIgKyBzaXplKSkKKwkJaWYgKGFkZF9rbW1pb19mYXVsdF9wYWdlKGFkZHIgKyBzaXplKSkKIAkJ CXByX2VycigiVW5hYmxlIHRvIHNldCBwYWdlIGZhdWx0LlxuIik7CiAJCXNpemUgKz0gcGFnZV9s ZXZlbF9zaXplKGwpOwogCX0KQEAgLTUyOCwxOSArNTI5LDIwIEBAIHZvaWQgdW5yZWdpc3Rlcl9r bW1pb19wcm9iZShzdHJ1Y3Qga21taW8KIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2ln bmVkIGxvbmcgc2l6ZSA9IDA7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gcC0+YWRkciAmIFBBR0Vf TUFTSzsKIAljb25zdCB1bnNpZ25lZCBsb25nIHNpemVfbGltID0gcC0+bGVuICsgKHAtPmFkZHIg JiB+UEFHRV9NQVNLKTsKIAlzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqcmVsZWFzZV9saXN0ID0g TlVMTDsKIAlzdHJ1Y3Qga21taW9fZGVsYXllZF9yZWxlYXNlICpkcmVsZWFzZTsKIAl1bnNpZ25l ZCBpbnQgbDsKIAlwdGVfdCAqcHRlOwogCi0JcHRlID0gbG9va3VwX2FkZHJlc3MocC0+YWRkciwg JmwpOworCXB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHIsICZsKTsKIAlpZiAoIXB0ZSkKIAkJcmV0 dXJuOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmttbWlvX2xvY2ssIGZsYWdzKTsKIAl3aGlsZSAo c2l6ZSA8IHNpemVfbGltKSB7Ci0JCXJlbGVhc2Vfa21taW9fZmF1bHRfcGFnZShwLT5hZGRyICsg c2l6ZSwgJnJlbGVhc2VfbGlzdCk7CisJCXJlbGVhc2Vfa21taW9fZmF1bHRfcGFnZShhZGRyICsg c2l6ZSwgJnJlbGVhc2VfbGlzdCk7CiAJCXNpemUgKz0gcGFnZV9sZXZlbF9zaXplKGwpOwogCX0K IAlsaXN0X2RlbF9yY3UoJnAtPmxpc3QpOwoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCk5vdXZlYXUgbWFpbGluZyBsaXN0Ck5vdXZlYXVAbGlzdHMuZnJl ZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vbm91dmVhdQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: AG47ELtm2vm2sz4mkjV+PKMc9P5pARTqirhM+ngUx5fYBMojUO42iusAzJdeMd7O2+mwZS1gzvf9 ARC-Seal: i=1; a=rsa-sha256; t=1519412171; cv=none; d=google.com; s=arc-20160816; b=y8RTaQ+S+pRUYfhrvJes4Kc+8eO5qX655pt5EsPo6IZpFcwhL34gVzecYgiMKeeJl3 hwje7Xo+M3GrNOvhpbtd4Gfq1VG8qXfAEFMUrWRQ79bhxlWLkks8vlZeYI2RxDyol4BK 6CKt0Gh6qjCA4H4Xe4tlr3yqWfjNNqu6VrAbwoGx8+U0k3Ye3HX2j4Caz7wCnP8Dutne hQrTX7UmgttadUTZvUCBryWQWAUJv+U4ulo4r47hJ28cAfF/NIZdYI/zYxuEJYcmF06N sZ+LF6hS/UIRoBZ/d1lBcCgRFEyUnLzULCzmkZ4YgJBXqI+qARA/x6LkEGpt9mw5FG9d 7tLA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:user-agent:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=AqjO7q8vzlqakhM/YU2L42myq/51gIKu/Mm5opxfZ8k=; b=IkafqKNJJUMpjlg+xWaEOJE5k7g6VQottz9Jq5chGEWEhb2lfVBlkAX4467bsQYS6p GfyroizSTK7Hyfj8BNmlQtJ5vnJUq0hm/N5BUmxa/9YgUyXIajBiN44q9GyngHPIP//5 xsY1/CjN222KeI1I94XPwoL7bU/ziviNRKdaNCnjz1jI2bx7lH1smsb1Fz4NlSgroj7W 2Ci/Es6XBokVmpTIUr3eBrFhr4kKY4ZqlPwMTOA9YlG9V21oX9+cDZ78/w8QHjFGxNEy V6VcI5NvSOcOibbeMyKz4si21907gweONhYVikDWo4ebSkaL6fL3ynQ7f6o3twj8ygI6 W9Uw== ARC-Authentication-Results: i=1; mx.google.com; spf=softfail (google.com: domain of transitioning gregkh@linuxfoundation.org does not designate 90.92.71.90 as permitted sender) smtp.mailfrom=gregkh@linuxfoundation.org Authentication-Results: mx.google.com; spf=softfail (google.com: domain of transitioning gregkh@linuxfoundation.org does not designate 90.92.71.90 as permitted sender) smtp.mailfrom=gregkh@linuxfoundation.org From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Lyude , Karol Herbst , Pekka Paalanen , Linus Torvalds , Peter Zijlstra , Steven Rostedt , Thomas Gleixner , nouveau@lists.freedesktop.org, Ingo Molnar , Sasha Levin Subject: [PATCH 4.14 148/159] x86/mm/kmmio: Fix mmiotrace for page unaligned addresses Date: Fri, 23 Feb 2018 19:27:36 +0100 Message-Id: <20180223170800.883691621@linuxfoundation.org> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180223170743.086611315@linuxfoundation.org> References: <20180223170743.086611315@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-LABELS: =?utf-8?b?IlxcU2VudCI=?= X-GMAIL-THRID: =?utf-8?q?1593217627914352720?= X-GMAIL-MSGID: =?utf-8?q?1593219137940438466?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ 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 Signed-off-by: Greg Kroah-Hartman --- arch/x86/mm/ioremap.c | 4 ++-- arch/x86/mm/kmmio.c | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -349,11 +349,11 @@ void iounmap(volatile void __iomem *addr return; } + mmiotrace_iounmap(addr); + addr = (volatile void __iomem *) (PAGE_MASK & (unsigned long __force)addr); - 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 --- a/arch/x86/mm/kmmio.c +++ b/arch/x86/mm/kmmio.c @@ -435,17 +435,18 @@ int register_kmmio_probe(struct kmmio_pr unsigned long flags; int ret = 0; unsigned long size = 0; + unsigned long addr = p->addr & PAGE_MASK; const unsigned long size_lim = p->len + (p->addr & ~PAGE_MASK); unsigned int l; pte_t *pte; spin_lock_irqsave(&kmmio_lock, flags); - if (get_kmmio_probe(p->addr)) { + if (get_kmmio_probe(addr)) { ret = -EEXIST; goto out; } - pte = lookup_address(p->addr, &l); + pte = lookup_address(addr, &l); if (!pte) { ret = -EINVAL; goto out; @@ -454,7 +455,7 @@ int register_kmmio_probe(struct kmmio_pr 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 += page_level_size(l); } @@ -528,19 +529,20 @@ void unregister_kmmio_probe(struct kmmio { unsigned long flags; unsigned long size = 0; + unsigned long addr = p->addr & PAGE_MASK; const unsigned long size_lim = p->len + (p->addr & ~PAGE_MASK); struct kmmio_fault_page *release_list = NULL; struct kmmio_delayed_release *drelease; unsigned int l; pte_t *pte; - pte = lookup_address(p->addr, &l); + pte = lookup_address(addr, &l); if (!pte) return; 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 += page_level_size(l); } list_del_rcu(&p->list);