From patchwork Fri Dec 4 22:31:13 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Scott Wood X-Patchwork-Id: 552906 X-Patchwork-Delegate: scottwood@freescale.com Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 71F531402B4 for ; Sat, 5 Dec 2015 09:32:36 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 564A91A0E2B for ; Sat, 5 Dec 2015 09:32:36 +1100 (AEDT) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from na01-bl2-obe.outbound.protection.outlook.com (mail-bl2on0139.outbound.protection.outlook.com [65.55.169.139]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id EF0311A0519 for ; Sat, 5 Dec 2015 09:31:38 +1100 (AEDT) Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=scottwood@freescale.com; Received: from snotra.am.freescale.net (192.88.168.49) by BY1PR03MB1484.namprd03.prod.outlook.com (10.162.210.142) with Microsoft SMTP Server (TLS) id 15.1.331.20; Fri, 4 Dec 2015 22:31:28 +0000 From: Scott Wood To: Subject: [PATCH v2] powerpc/e6500: add locking to hugetlb Date: Fri, 4 Dec 2015 16:31:13 -0600 Message-ID: <1449268273-8643-1-git-send-email-scottwood@freescale.com> X-Mailer: git-send-email 2.5.0 MIME-Version: 1.0 X-Originating-IP: [192.88.168.49] X-ClientProxiedBy: SN1PR0701CA0041.namprd07.prod.outlook.com (25.162.96.51) To BY1PR03MB1484.namprd03.prod.outlook.com (25.162.210.142) X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1484; 2:nm1T9tnPgXeS0reqgp8s0qEaoFHbwDyEsC4jPqwa1caLxEk6FBVV35ghHPbx57OM/lWS38g+beF9RlJUWWhm4RbqY/JQjlvQ1V5RMLHwsQNwReKUhfvHjKsVG3/Ge7kh7JOUxkq5bBXgA6UM1+Hk+w==; 3:PzLTTS6KOl4tIF6c1o83w/E2qUKrExKbUoKj4flCQN+iZ64/+Q3WeK6z9BqTIE2AZx42Qf0w2fJ21XXwgBrPiWBqxCkYhRbJh01FlaHbsSRAIpgW6HhRRpQMKxnfZ6yI; 25:hxkB7Q+7h3QQSrNU3KJVnj6vLLUSbMHsY5oKQj1onGICVvVvrPJFE7kBLSdWoZyU/zK2e+3WPHKm49u8S16ULeSz+0IAlSgEihp2rACqTagrpPaEu4ZFM2SW58WdZrLBijC4vIQ2YlMxNjcbIeWU3BCk1X3VTCFtA0+E2tN646ttxoUUfqPr9f7UZ9px8+9pfrbkEms4tRkHytDr5bxK2CjwBgd24kVMkdVYfyOSwGYhOKGMcpKd1/UM01FBp2g3MR//RDMraxsNBDcbIjvKSA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR03MB1484; X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1484; 20:jtrS40XMU5Cgx1c96C5yMBPjWHnVE5rOU56GREv/4rmO7wlAFuY9E9OaNr57HB0oPL4TrYjKzCZDpZypWUW32b/eDt8IYiHogd1339Zuf57Vc1u0q6VOwG73jOY0umacDOa5L4p39cWG8eu4Ks026dRLo6jYrQZcfHFRPgLSPOVew69bKWSXrFe9IdYJppIHGnyrtdy5H/MJCT9OJZnY5R2nwxO3McPbqsGEiA4k+1pJJvgNqR7jF0G1jOmft7Oej9SkD2vB3MLiycoEEE6NTOzFjX2Kf4wZRIOZ+8AShD1Y3go5h3At8y6HgVzLd2Y2YVmmHd8bKN6QhvADwqSOemlHKcUR5AXJVkGGmFVwKnhDyczmx2ORagFKGQdA8LO1ErEQ3N0j1u9Qeduyf3u9kdoJXEtTykmz0X3kvEn7sbrjPAzfTqMc4dPGApQ44Xel8055baCxymb6JwbWJrsK2H+rqjiZgO2Nsash4OUZU3G04BIZpjy1oGRNKYj7v5rv; 4:rrPMrVYbdd+V5tc84M2YVQY5bPeCEGXuaRYjzae2cwJF+EGGecgEzgrO+DSCT4IlEQPlaQLLLMUP3ohlnsdQMn52hemcura2eDRG4NJ3UdVIYp5ofxcBDLR+4FodYybMma9bDqcYQrIg/yp3Y8uP+xdxva02+zZ2TkWNkmaEC46ptbJ/+jKra0OYZshan7+lpbB8Yzw3YXVI+0PCQ/WemnBwfoQxSMmB8nLG6fec6Ruc9aAT9yFfnWrGvGHVPv+zw04xtfdcgruEXKDoG4tjYc6U9glTd3AqLZN4xJkyuxh9wYBHyRSro7nkGkIFZGbGXLE/YqVmuXxhbbEaA52vf2Ldr76d4iDaURgbKESsdGFtk/1XUx0nhDkf9Lbnv1PmodS6pmOP25y54fWSUaj9iVWlMdoJg9r+g5rfaE4oBwzX5M7CE9xItKEFTLxln/eg X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(520078)(5005006)(3002001)(10201501046); SRVR:BY1PR03MB1484; BCL:0; PCL:0; RULEID:; SRVR:BY1PR03MB1484; X-Forefront-PRVS: 07807C55DC X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6009001)(189002)(199003)(19580405001)(50226001)(229853001)(4001430100002)(586003)(19580395003)(5001960100002)(87976001)(5003940100001)(6116002)(107886002)(2351001)(110136002)(189998001)(92566002)(77096005)(3846002)(48376002)(33646002)(50986999)(101416001)(5004730100002)(50466002)(1096002)(40100003)(86362001)(97736004)(81156007)(36756003)(47776003)(5008740100001)(66066001)(42186005)(106356001)(105586002)(450100001)(122386002); DIR:OUT; SFP:1102; SCL:1; SRVR:BY1PR03MB1484; H:snotra.am.freescale.net; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: freescale.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY1PR03MB1484; 23:8Y3k3hQNtEqd849GlLvgYPepCGypYZOG4lHtDifcD?= =?us-ascii?Q?ys/TzwvtkRw4Qc+F72Yhn/TsswmjBMO6GJgLYG28WmLiOeySz2QYEx8KyAY+?= =?us-ascii?Q?wSCndJlXaBRdDrrem95VtXkFhayFpn3BlkPQg8chHPblqybxs3OyeII0GTss?= =?us-ascii?Q?C2k04n52xTOgJMLw1lkeEB/NlXEhyeJjGDKDHntJ+i25lSCjp5Hd2HeWvG4Y?= =?us-ascii?Q?cf/AFKkdAe8WW4dnXNHVYZ/LnM/CDF2VvtOvNFwSTYLia6kVRA2wSlaIMoq3?= =?us-ascii?Q?Zq8ynSnLQ9VY6xn2OvYk4fkl0qoO3GVPcb0m90t0Xntx8l3fA1QYFBJbQ1SQ?= =?us-ascii?Q?dP9lJ1LBumHNTX1M92RMLoizXAAv1gvSp0A9gDG/iJAnJa+m0yiZAH2RRhhj?= =?us-ascii?Q?SITAcGozJpf3lRiNc4l0eDA36cYbiD1VDEGPSSw5k8k+0r/PX4v9NDx611U6?= =?us-ascii?Q?lZsvJwejSAFwwPfU/qxUQE+rwzKmNJjGlaae/QkeG61Ktn8j2DhTl1E7LpJF?= =?us-ascii?Q?9AIHJOvhkI9uFA1SDZsCXAlObed2IhkmT66FPWsxBnnVIwjFCe5UYNozXVlE?= =?us-ascii?Q?r1YXyshzLOCckJn9RB/792FOrl/Lap7uk1NqZoUIQsZXSAO/Y32ZFXVFXx4p?= =?us-ascii?Q?y7x/n+w6gf4+ecq1v/NO1S3ZQJJmdDUrUG3uS89OERC4zx61zaiojvyBEuyV?= =?us-ascii?Q?jElzqkhvaPt697jZ+ylBxX5D7qYXWWEMd1t3Urw0oRTBiVT7QD+9Ab28uAG3?= =?us-ascii?Q?wMIFoZvYO1CCA0A8PAV1MQjB+NRRWpKMLNV7MSvth0uTvyiIFTjCmNCWeHtH?= =?us-ascii?Q?lECicY67Muu3ovnByYtwa7GLRWU4kqX+09ABvzTEEBQWOmnHK6m+aB2egdgf?= =?us-ascii?Q?BmaqpGVyEFLj725ZXX1go64CwVox300mJM2yX46f76QfUeUh+wP0cwjRF/0a?= =?us-ascii?Q?YaawytjLYdd/eplx++oW6FIIYKVJpyf70ZVNKcyQPMMpTyt0fvTiv3sAYoFq?= =?us-ascii?Q?qM1V2gvVuqYjjAj5Hc6DmmzZWDkACli7beP1AGc0dDiEvkBycRIO7uAS7/XS?= =?us-ascii?Q?8OiG/TtlDUDk10GHwp3XD88r3eT?= X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1484; 5:WgJ7Lu1k/+F4duGVZZi90hkf3OthgknBzqqn3hFmRm2X31Xy3pfQ9WY+0PHrB8VF/PLTkYPZV3mYZ3RJJ0asdLnnrqDpRx5aqNF/57KH7tAlFrg11+saQZPtHUohyFZdTO122ZnNwDj2rQNvdXC2IQ==; 24:HV3jbJVnAkTvbs0SiG3uQ/kzDR2Jv8gASNLZm0/mRaARWipXr78lJjfXiU68ySbdmNN+mNA6lHcjisUwfcD6WLBcLsTLjXSBFQNeWXAtjyo= X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Dec 2015 22:31:28.1199 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR03MB1484 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Scott Wood Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" e6500 has threads but does not have TLB write conditional. Thus, the hugetlb code needs to take the same lock that the normal TLB miss handlers take, to ensure that the tlbsx and tlbwe are atomic. Signed-off-by: Scott Wood --- v2: Fix trailing whitespace arch/powerpc/mm/hugetlbpage-book3e.c | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/arch/powerpc/mm/hugetlbpage-book3e.c b/arch/powerpc/mm/hugetlbpage-book3e.c index ba47aaf..180707e 100644 --- a/arch/powerpc/mm/hugetlbpage-book3e.c +++ b/arch/powerpc/mm/hugetlbpage-book3e.c @@ -51,6 +51,48 @@ static inline int mmu_get_tsize(int psize) return mmu_psize_defs[psize].enc; } +#if defined(CONFIG_PPC_FSL_BOOK3E) && defined(CONFIG_PPC64) +#include + +static inline void book3e_tlb_lock(void) +{ + struct paca_struct *paca = get_paca(); + unsigned long tmp; + int token = smp_processor_id() + 1; + + asm volatile("1: lbarx %0, 0, %1;" + "cmpwi %0, 0;" + "bne 2f;" + "stbcx. %2, 0, %1;" + "bne 1b;" + "b 3f;" + "2: lbzx %0, 0, %1;" + "cmpwi %0, 0;" + "bne 2b;" + "b 1b;" + "3:" + : "=&r" (tmp) + : "r" (&paca->tcd_ptr->lock), "r" (token) + : "memory"); +} + +static inline void book3e_tlb_unlock(void) +{ + struct paca_struct *paca = get_paca(); + + isync(); + paca->tcd_ptr->lock = 0; +} +#else +static inline void book3e_tlb_lock(void) +{ +} + +static inline void book3e_tlb_unlock(void) +{ +} +#endif + static inline int book3e_tlb_exists(unsigned long ea, unsigned long pid) { int found = 0; @@ -109,7 +151,10 @@ void book3e_hugetlb_preload(struct vm_area_struct *vma, unsigned long ea, */ local_irq_save(flags); + book3e_tlb_lock(); + if (unlikely(book3e_tlb_exists(ea, mm->context.id))) { + book3e_tlb_unlock(); local_irq_restore(flags); return; } @@ -141,6 +186,7 @@ void book3e_hugetlb_preload(struct vm_area_struct *vma, unsigned long ea, asm volatile ("tlbwe"); + book3e_tlb_unlock(); local_irq_restore(flags); }