From mboxrd@z Thu Jan 1 00:00:00 1970 From: Greg Kroah-Hartman Subject: [PATCH 4.4 059/193] x86/mm/kmmio: Fix mmiotrace for page unaligned addresses Date: Fri, 23 Feb 2018 19:24:52 +0100 Message-ID: <20180223170335.220215513@linuxfoundation.org> References: <20180223170325.997716448@linuxfoundation.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180223170325.997716448-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 NC40LXN0YWJsZSByZXZpZXcgcGF0Y2guICBJZiBhbnlvbmUgaGFzIGFueSBvYmplY3Rpb25zLCBw bGVhc2UgbGV0IG1lIGtub3cuCgotLS0tLS0tLS0tLS0tLS0tLS0KCkZyb206IEthcm9sIEhlcmJz dCA8a2hlcmJzdEByZWRoYXQuY29tPgoKClsgVXBzdHJlYW0gY29tbWl0IDZkNjBjZTM4NGQxZDVj YTMyYjU5NTI0NGRiNDA3N2E0MTlhY2M2ODcgXQoKSWYgc29tZXRoaW5nIGNhbGxzIGlvcmVtYXAo KSB3aXRoIGFuIGFkZHJlc3Mgbm90IGFsaWduZWQgdG8gUEFHRV9TSVpFLCB0aGUKcmV0dXJuZWQg YWRkcmVzcyBtaWdodCBiZSBub3QgYWxpZ25lZCBhcyB3ZWxsLiBUaGlzIGxlZCB0byBhIHByb2Jl CnJlZ2lzdGVyZWQgb24gZXhhY3RseSB0aGUgcmV0dXJuZWQgYWRkcmVzcywgYnV0IHRoZSBlbnRp cmUgcGFnZSB3YXMgYXJtZWQKZm9yIG1taW90cmFjaW5nLgoKT24gY2FsbGluZyBpb3VubWFwKCkg dGhlIGFkZHJlc3MgcGFzc2VkIHRvIHVucmVnaXN0ZXJfa21taW9fcHJvYmUoKSB3YXMKUEFHRV9T SVpFIGFsaWduZWQgYnkgdGhlIGNhbGxlciBsZWFkaW5nIHRvIGEgY29tcGxldGUgZnJlZXplIG9m IHRoZQptYWNoaW5lLgoKV2Ugc2hvdWxkIGFsd2F5cyBwYWdlIGFsaWduIGFkZHJlc3NlcyB3aGls ZSAodW4pcmVnaXN0ZXJ1bmcgbWFwcGluZ3MsCmJlY2F1c2UgdGhlIG1taW90cmFjZXIgd29ya3Mg b24gdG9wIG9mIHBhZ2VzLCBub3QgbWFwcGluZ3MuIFdlIHN0aWxsIGtlZXAKdHJhY2sgb2YgdGhl IHByb2JlcyBiYXNlZCBvbiB0aGVpciByZWFsIGFkZHJlc3NlcyBhbmQgbGVuZ3RocyB0aG91Z2gs CmJlY2F1c2UgdGhlIG1taW90cmFjZSBzdGlsbCBuZWVkcyB0byBrbm93IHdoYXQgYXJlIG1hcHBl ZCBtZW1vcnkgcmVnaW9ucy4KCkFsc28gbW92ZSB0aGUgY2FsbCB0byBtbWlvdHJhY2VfaW91bm1h cCgpIHByaW9yIHBhZ2UgYWxpZ25pbmcgdGhlIGFkZHJlc3MsCnNvIHRoYXQgYWxsIHByb2JlcyBh cmUgdW5yZWdpc3RlcmVkIHByb3Blcmx5LCBvdGhlcndpc2UgdGhlIGtlcm5lbCBlbmRzIHVwCmZh aWxpbmcgbWVtb3J5IGFsbG9jYXRpb25zIHJhbmRvbWx5IGFmdGVyIGRpc2FibGluZyB0aGUgbW1p b3RyYWNlci4KClRlc3RlZC1ieTogTHl1ZGUgPGx5dWRlQHJlZGhhdC5jb20+ClNpZ25lZC1vZmYt Ynk6IEthcm9sIEhlcmJzdCA8a2hlcmJzdEByZWRoYXQuY29tPgpBY2tlZC1ieTogUGVra2EgUGFh bGFuZW4gPHBwYWFsYW5lbkBnbWFpbC5jb20+CkNjOiBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNA bGludXgtZm91bmRhdGlvbi5vcmc+CkNjOiBQZXRlciBaaWpsc3RyYSA8cGV0ZXJ6QGluZnJhZGVh ZC5vcmc+CkNjOiBTdGV2ZW4gUm9zdGVkdCA8cm9zdGVkdEBnb29kbWlzLm9yZz4KQ2M6IFRob21h cyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgpDYzogbm91dmVhdUBsaXN0cy5mcmVlZGVz a3RvcC5vcmcKTGluazogaHR0cDovL2xrbWwua2VybmVsLm9yZy9yLzIwMTcxMTI3MDc1MTM5LjQ5 MjgtMS1raGVyYnN0QHJlZGhhdC5jb20KU2lnbmVkLW9mZi1ieTogSW5nbyBNb2xuYXIgPG1pbmdv QGtlcm5lbC5vcmc+ClNpZ25lZC1vZmYtYnk6IFNhc2hhIExldmluIDxhbGV4YW5kZXIubGV2aW5A bWljcm9zb2Z0LmNvbT4KU2lnbmVkLW9mZi1ieTogR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hA bGludXhmb3VuZGF0aW9uLm9yZz4KLS0tCiBhcmNoL3g4Ni9tbS9pb3JlbWFwLmMgfCAgICA0ICsr LS0KIGFyY2gveDg2L21tL2ttbWlvLmMgICB8ICAgMTIgKysrKysrKy0tLS0tCiAyIGZpbGVzIGNo YW5nZWQsIDkgaW5zZXJ0aW9ucygrKSwgNyBkZWxldGlvbnMoLSkKCi0tLSBhL2FyY2gveDg2L21t L2lvcmVtYXAuYworKysgYi9hcmNoL3g4Ni9tbS9pb3JlbWFwLmMKQEAgLTM0OCwxMSArMzQ4LDEx IEBAIHZvaWQgaW91bm1hcCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIKIAkgICAgKHZvaWQg X19mb3JjZSAqKWFkZHIgPCBwaHlzX3RvX3ZpcnQoSVNBX0VORF9BRERSRVNTKSkKIAkJcmV0dXJu OwogCisJbW1pb3RyYWNlX2lvdW5tYXAoYWRkcik7CisKIAlhZGRyID0gKHZvbGF0aWxlIHZvaWQg X19pb21lbSAqKQogCQkoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyKTsK IAotCW1taW90cmFjZV9pb3VubWFwKGFkZHIpOwotCiAJLyogVXNlIHRoZSB2bSBhcmVhIHVubG9j a2VkLCBhc3N1bWluZyB0aGUgY2FsbGVyCiAJICAgZW5zdXJlcyB0aGVyZSBpc24ndCBhbm90aGVy IGlvdW5tYXAgZm9yIHRoZSBzYW1lIGFkZHJlc3MKIAkgICBpbiBwYXJhbGxlbC4gUmV1c2Ugb2Yg dGhlIHZpcnR1YWwgYWRkcmVzcyBpcyBwcmV2ZW50ZWQgYnkKLS0tIGEvYXJjaC94ODYvbW0va21t aW8uYworKysgYi9hcmNoL3g4Ni9tbS9rbW1pby5jCkBAIC00MzQsMTcgKzQzNCwxOCBAQCBpbnQg cmVnaXN0ZXJfa21taW9fcHJvYmUoc3RydWN0IGttbWlvX3ByCiAJdW5zaWduZWQgbG9uZyBmbGFn czsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBsb25nIHNpemUgPSAwOworCXVuc2lnbmVkIGxv bmcgYWRkciA9IHAtPmFkZHIgJiBQQUdFX01BU0s7CiAJY29uc3QgdW5zaWduZWQgbG9uZyBzaXpl X2xpbSA9IHAtPmxlbiArIChwLT5hZGRyICYgflBBR0VfTUFTSyk7CiAJdW5zaWduZWQgaW50IGw7 CiAJcHRlX3QgKnB0ZTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZrbW1pb19sb2NrLCBmbGFncyk7 Ci0JaWYgKGdldF9rbW1pb19wcm9iZShwLT5hZGRyKSkgeworCWlmIChnZXRfa21taW9fcHJvYmUo YWRkcikpIHsKIAkJcmV0ID0gLUVFWElTVDsKIAkJZ290byBvdXQ7CiAJfQogCi0JcHRlID0gbG9v a3VwX2FkZHJlc3MocC0+YWRkciwgJmwpOworCXB0ZSA9IGxvb2t1cF9hZGRyZXNzKGFkZHIsICZs KTsKIAlpZiAoIXB0ZSkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTQ1Myw3 ICs0NTQsNyBAQCBpbnQgcmVnaXN0ZXJfa21taW9fcHJvYmUoc3RydWN0IGttbWlvX3ByCiAJa21t aW9fY291bnQrKzsKIAlsaXN0X2FkZF9yY3UoJnAtPmxpc3QsICZrbW1pb19wcm9iZXMpOwogCXdo aWxlIChzaXplIDwgc2l6ZV9saW0pIHsKLQkJaWYgKGFkZF9rbW1pb19mYXVsdF9wYWdlKHAtPmFk ZHIgKyBzaXplKSkKKwkJaWYgKGFkZF9rbW1pb19mYXVsdF9wYWdlKGFkZHIgKyBzaXplKSkKIAkJ CXByX2VycigiVW5hYmxlIHRvIHNldCBwYWdlIGZhdWx0LlxuIik7CiAJCXNpemUgKz0gcGFnZV9s ZXZlbF9zaXplKGwpOwogCX0KQEAgLTUyNywxOSArNTI4LDIwIEBAIHZvaWQgdW5yZWdpc3Rlcl9r 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: AG47ELv+7xGz+10hWbTJTDZcYXC6sJ/M7ohbjgwMYIhp3QiRhJnTCat7JYc8/YnacGABnGx2OMmI ARC-Seal: i=1; a=rsa-sha256; t=1519410923; cv=none; d=google.com; s=arc-20160816; b=vYKsNiZ+K/ibxdpAMPrF8elOOnCIgBK3zud7OfLjhufs4wMItsNbCxsOkSx55O2hHT ZnV4a8C1qSoPmSMNmyFUR67vnVrJj6FYZGdQHT4CxLq69cBfXmdsIYEVyaNbPmL4/x+P vR8xgfSLAxydYMu+njex0ycKQjsLjOOeSfpn+1whL/XIWDZImxEH5hB/E5sd1GUXQrIE I2BDxnD91Mj1B3zDzqj+xiYJDmZbwEWBlHeWq6wyXgRCj+gFhCxE6VLmOsRt2iNrcBeQ qGF4OgP9KQBKAUQtJ5ogBjiQG6UwUyK7FPEnIlaZEm97eCHia6k/J7+bEN+CZDPQ7NeD I8Uw== 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=w+JU5RV7KnYAT2gPQDiCqeBhb30Xa3UGQXJC3de36Xo=; b=IwlJkqkzZocF4JgS2n4VWhum8Ad5rjyAsRW1PmQsf8pA6CIRlclZezCbMREGSNL5BL Fu4m/ZMCdzyuTGOtfwimWJ45WZOidQPlxnlMB4WhaIkNbtEGfAX5MJEg180YTy6Obiyk vMSZNelibRsyIZ/lltBs2AmA+ocuDRwfJ23YUsEt0K2/fzlF3w9fOQE11TGoOhF6HRpk WpCMI18VDtAs0ZOVayWJYtgg47KSxzLXbnXXxK57ua5N12pj77yLIOGMqSNCINRCcRy1 gPaUjD7j6VSPCHzIOoZJKAKvc7UOBgkGqqa8ylodBdicOQ9yct4KK8Y0WnAOFcOi+T1p FWrQ== 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.4 059/193] x86/mm/kmmio: Fix mmiotrace for page unaligned addresses Date: Fri, 23 Feb 2018 19:24:52 +0100 Message-Id: <20180223170335.220215513@linuxfoundation.org> X-Mailer: git-send-email 2.16.2 In-Reply-To: <20180223170325.997716448@linuxfoundation.org> References: <20180223170325.997716448@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?1593217828551348582?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: 4.4-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 @@ -348,11 +348,11 @@ void iounmap(volatile void __iomem *addr (void __force *)addr < phys_to_virt(ISA_END_ADDRESS)) 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 @@ -434,17 +434,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; @@ -453,7 +454,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); } @@ -527,19 +528,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);