From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933047AbcCKWMK (ORCPT ); Fri, 11 Mar 2016 17:12:10 -0500 Received: from mail-am1on0061.outbound.protection.outlook.com ([157.56.112.61]:10304 "EHLO emea01-am1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933017AbcCKWMC (ORCPT ); Fri, 11 Mar 2016 17:12:02 -0500 Authentication-Results: spf=fail (sender IP is 12.216.194.146) smtp.mailfrom=ezchip.com; mellanox.com; dkim=none (message not signed) header.d=none;mellanox.com; dmarc=fail action=none header.from=mellanox.com; From: Chris Metcalf To: Gilad Ben Yossef , Steven Rostedt , Ingo Molnar , Peter Zijlstra , Andrew Morton , "Rik van Riel" , Tejun Heo , Frederic Weisbecker , Thomas Gleixner , "Paul E. McKenney" , Christoph Lameter , Viresh Kumar , Catalin Marinas , Will Deacon , Andy Lutomirski , CC: Chris Metcalf Subject: [PATCH v11 11/13] arch/tile: enable task isolation functionality Date: Fri, 11 Mar 2016 17:10:21 -0500 Message-ID: <1457734223-26209-12-git-send-email-cmetcalf@mellanox.com> X-Mailer: git-send-email 2.7.2 In-Reply-To: <1457734223-26209-1-git-send-email-cmetcalf@mellanox.com> References: <1457734223-26209-1-git-send-email-cmetcalf@mellanox.com> X-EOPAttributedMessage: 0 X-Forefront-Antispam-Report: CIP:12.216.194.146;IPV:NLI;CTRY:US;EFV:NLI;SFV:NSPM;SFS:(10009020)(6009001)(2980300002)(1109001)(1110001)(339900001)(33646002)(36756003)(87936001)(42186005)(48376002)(575784001)(86362001)(960300001)(85426001)(2950100001)(1220700001)(47776003)(50226001)(106466001)(189998001)(19580395003)(19580405001)(586003)(107886002)(5001970100001)(50986999)(11100500001)(5008740100001)(104016004)(2906002)(1096002)(4001430100002)(229853001)(4326007)(76176999)(5003940100001)(105606002)(6806005)(50466002)(92566002)(5001770100001)(921003)(1121003)(83996005);DIR:OUT;SFP:1101;SCL:1;SRVR:AM4PR05MB1522;H:ld-1.internal.tilera.com;FPR:;SPF:Fail;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: 1;DB3FFO11FD038;1:fI5FUMuiJkbK5ViNMUQ3HMZV1X/F3QSmK1vFFAf4SgiYhLex9sqJ+nHV8jV1JCPwZe+mafog1dnG4MjkcWlyw7dVw2+hT/yAIwUhj8Rk1zCjzqikMGiKOseK84WEc8RhBApE8AqJfPcVPj9309lMQLUjhTtlGtHzOWFD7VZ8VkzBjNYUIXLJszQCtBUDMfZ5umFkxVfHkZ4v2RBJHh9xc8EskGQsY1g89yO3/6o6CgkdtzKcKPE3VSB2FgqbGq0X3MxokfWMq38JTpGSNZ3Uapo/Rqa91L+oqv5m7jy5fwyE/CP7Iq+/BEQNGuIDvFC8Escc3c6BelfGm+tcIpFs3LptiDbeMP7V4tqB+5NdnCOryFhbR8kDoC8iaNMhXNoZqPj6d/0emvpEhxWRQbG++TqkeooYamjk5IzxeQxb40ZbOsiH5L9WB0/k2thrH7MvrHIA4dTGu2F+OmzsATty5PnD9KdayohddX+zO9UgCqnAGnhhihsxwC4QvA4tsxTpeHIC4OiUCUKsFXYbkUuKWXfPeE0/e0+62Om9y/SSzelBQj/hCz5Ql6fYNldtduPb MIME-Version: 1.0 Content-Type: text/plain X-MS-Office365-Filtering-Correlation-Id: 1548e50b-c80b-481c-a1c4-08d349fa2955 X-Microsoft-Exchange-Diagnostics: 1;AM4PR05MB1522;2:4fooj7ByDZ3o2YY1kQjVIzE7OvJjoZ5YH9QDSnacydjdSh80IjQltXwEf75tC1GbLR/XbJTf18YJeuiwVYX3r0SKMYhBaCdDLiK72yz9Zl/sesnm41WgV3dC6aPc1T7kHCf0ULlNObZ09fSW9AQGP+t+lsRZievatEcDKFT0yC1fAG9d1o/ZeBb6T7oayj97;3:txxJ/M22Hn57M+Hh1/7yvC+OElddVs4g0QRqyDOUswi0VfmsbaT/YcUKMmrj+bDS+Xjd5iso4YvjDpErHvUOlzYiCVansCei/+V+eGg3Esf3sL3d92wqt1PTegVytNvN/4jMhKQp6m+R4az+RxuSoK3Kyg8eG5QcNZXjZo2zT4tP+iplVmo/yfT5gWXCXxRokJKLCedjRueQCf5pYeiqNyBsdp0gfHpvrN2IujpM5DQ=;25:ASaTEJikCHk1qCdGGhEYZsFDVa/uz76MM4HsDnpMh2cvNOHpgvqoKrvNTptcuVvm2GEBuyPXOB8dlqnmMcfUdp21BeDbF1gUPiTi5OXDdE5YGEaiYCVxav9o0qaRpmvpVzp/8iKVSMdbvj4EKTSLhbD8Q5TUtnbOHSUP8TIfCEq6QSmRKfopn/6AqyF6cL0gfimBMdGMwVvbWZQ+0CaQF9pqZ0szSh1t+1Ia//WtY2Pkaszaw8i5tmR1DJtx9iTet4gNGeYXQjsIqzOV02Ek2rUBh96lekQtoaXbGuS9pIbBVNCqaxTtjqguulEIUDEJwJzSKoyVx0TRufsG+8fR1Q== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:AM4PR05MB1522; X-MLNXRule-EZCH-Linux: Rule triggered X-Microsoft-Exchange-Diagnostics: 1;AM4PR05MB1522;20:wPBNdB6HJHE40HKad/vzU8t2KdQ+qj1alLdlWkGiyQYEcy3Bn4w+ldDSsuArCquV6l/UAUfo6alUDvP6n1ZJbOvL2eIEMMXj3H3sXX6Lk+ArSO9B/a+BIrMZiUYvpqanhwOfIHr6mseZ4MAd6fBY8XgUWY8q/dSZ7mF2dtXZrsCiFd3k0ucI7QbbzK8T22hC4wRJ0Bx1pEEMdP7dv9V7OkQp7HyadtWXVIfMYFTfj4EQCSDccDgH2WQ/KkzO3NAKAXR0VmcQsXQrq+U/0Tw4TJ79oVgkoOKkcBDvMEjm1goFn22juIRl+saL9wJQtndsv0OuQlABm+26v8Ttxw0D0HgSOWk/r8/c+2dBY7KU2e+qz5zKtOQRFH+81hyk49qXlmbj2Xn3f6Jvzp1yoZUXe5xQJ8J4pKhvyZnYCTGtlsvAcsD61i5jryTiY6KgKX/7ei9tT3E94hFunITuvMA6pec1fs52hGosw4ej8Pr6BgNo/YwJr6h6p2hjCdhl4N95 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(13023025)(8121501046)(5005006)(13024025)(13017025)(13018025)(13015025)(10201501046)(3002001);SRVR:AM4PR05MB1522;BCL:0;PCL:0;RULEID:;SRVR:AM4PR05MB1522; X-Microsoft-Exchange-Diagnostics: 1;AM4PR05MB1522;4:uYBDyTPv9JqzmCD+Gnp6+gSBn8kLB6E/yQJzrUqPx47St7YyYUiypHl74EEUTVHbeAIK3V2hlH3zeCH0APA8rqADRCj66D0xR/b9bIJ/NhTsdvjHa5yhvDCS/WTUzDvYOaZ+yKmfTrZPbZYJlRvSbSQ335zD8z67b/kAHHh6wJLHytmFFbuaP97zxR44IkPyLkDseQe3wVQZJLwAHMpled5CSoDjjF4FjVPfG4yhZQBbmXGq8zNnhqUvwqPcF9OaPfhgf4/Z/na8HNzHgekkS3hZam1x8UhHUSf6ed8Q80Mke0FunjyDDwaSqJHxEJ/OQ5G+GMqnGIqmopYEfqlP/6aWk8RTPlG8J+iJMQG+Kp+840aCQjwv3HSJA4Ya3HH8sQmi0mA0H3FN2ZubFtGmzDGJ39GhcdZgxGTkk6MmN6MI68UsHqfvBDtfXWXIXE7ntKNlGHLcn5IQigAnVpGsjw== X-Forefront-PRVS: 087894CD3C X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1;AM4PR05MB1522;23:Bc0roNr25cdLuhCh9UaYoSfrKbz5Kpw2yZevV7SKX?= =?us-ascii?Q?6ySqedW4xo/5QlpjxHaA+KlJhJImjNH9zFxe86MGrlzsxPbzNk4UnRW/MPWc?= =?us-ascii?Q?Zzf4ZHpZLqvCUduC9u7iANqHClFI9oGF0+Rdr7PIICNopu4d4Cm209nCnbOZ?= =?us-ascii?Q?+IvwT2lDcHPi7s1Gev8M8oejqq5gaoeq+gMTT7Wu1CN6MxQIktRC1QxWsbLJ?= =?us-ascii?Q?ooOvzvV7TH8QKTa8cFTtq03/m/7RxuJc9tRnSAO/qS+AlA98KneYD7TysZoQ?= =?us-ascii?Q?YQ2jm/VOHCRsyiTVn9UVIbqfZO7oIgyzfJ24+9limRXlgW9qCtELEdojsw9o?= =?us-ascii?Q?AQyErlSpdHf6HN3VsMci93ESr8B354qMGLcVt8rb6Flav4dGwJrFlg3632B+?= =?us-ascii?Q?2HOBOGuJ7fzhtxWUXZcTucaLt4789B2N3ryCCElfTsmXqic1IHyClSlK67rz?= =?us-ascii?Q?9Tv+OUUSTTpq7UCo9YBoWFXX4sJYJcMq15r4ri7ksfMutP0+vhweq0NeOeh7?= =?us-ascii?Q?3nFOg6Aqh7+rsc+Uh54iqzy8Cyarg1Pp4yl9Y06tcnlj6Dy1ZLrPBTh3Fk66?= =?us-ascii?Q?FWky0up4i6GmkN2jNoWQgMR1XhZPT6o6Z03G8+N2WVLsUQgLY2x1G9hFt6tc?= =?us-ascii?Q?wZN4f127PBrhcM+UEg8SXhLF6ix/MZ12XxjxQNCoav9+E7/QNAbi4EjOQ2Qj?= =?us-ascii?Q?pbKm02tohq+A9GG4fjpDBBZtHJAYhAnTYFombcDZbXgo9Ifxj1DhOn7jcvDQ?= =?us-ascii?Q?oVkBNZi3LCqWpjchjVicbabKeWHN9FE34uAZXDryku8oDdECK1toR0JQAH6G?= =?us-ascii?Q?Nk9WxKJ6zor4A5zFa6FvAMy2ZPedEf9dtW3lcgki9Y5BvNjjrelfldOWNonZ?= =?us-ascii?Q?h1BkBB+3JdxsAgvtjN/P20fNtds7UQJoJ9rWqpmwSKPpdd4URIkTOMPrjZ7R?= =?us-ascii?Q?MMKZZtHe7Sz0N+X2f97obVptLx67zienqBUpq24Jv4NW7dacFa1BNPle7+HN?= =?us-ascii?Q?5kYTNSdJZult2QILRw8KTiu6jjG1QTh8fndVZTP/WtgY8RrSl+fvZ2u4awxp?= =?us-ascii?Q?b9NS4wylbJ0RAK7NPcUDvWhv73ig/NES7H0rk2GzTsnD8A92dd36T54JopU4?= =?us-ascii?Q?tMPtU6ACtRTUChB5dS4dB95fRbjv20NL6fG2Z5uXb5So2VwtOBQqaDrJ4fTB?= =?us-ascii?Q?jQ09+VSZXrH2EQ=3D?= X-Microsoft-Exchange-Diagnostics: 1;AM4PR05MB1522;5:rKFkqYk+qtllnQSrKDyaCoc68/JadGfr2I0JZ2a1neVo/Jcj1/CWkDAGhTJI2HtXgtv9vzem7BBgnkznQxDacYN+jM80c9qfTvZeyw4ZGMF9s8HBMUSvvGzCqgtULv4CqVVF8nkx3omhGXz7rKsdUQ==;24:7ihbOvOHBMcvT/g3FKVfXz+ZWO0Ru/DbMa82kAcV5dsFW3e4aom0CH2edilBkme2+BZkriNy/klLPIshOMr8SoKq4aS4WBf8YFtBBhZenkc= X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Mar 2016 22:11:52.1241 (UTC) X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=a652971c-7d2e-4d9b-a6a4-d149256f461b;Ip=[12.216.194.146];Helo=[ld-1.internal.tilera.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM4PR05MB1522 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We add the necessary call to task_isolation_enter() in the prepare_exit_to_usermode() routine. We already unconditionally call into this routine if TIF_NOHZ is set, since that's where we do the user_enter() call. We add calls to task_isolation_check_exception() in places where exceptions may not generate signals to the application. Signed-off-by: Chris Metcalf --- arch/tile/include/asm/thread_info.h | 4 +++- arch/tile/kernel/process.c | 9 +++++++++ arch/tile/kernel/ptrace.c | 7 +++++++ arch/tile/kernel/single_step.c | 5 +++++ arch/tile/kernel/smp.c | 28 ++++++++++++++++------------ arch/tile/kernel/unaligned.c | 3 +++ arch/tile/mm/fault.c | 3 +++ arch/tile/mm/homecache.c | 2 ++ 8 files changed, 48 insertions(+), 13 deletions(-) diff --git a/arch/tile/include/asm/thread_info.h b/arch/tile/include/asm/thread_info.h index 4b7cef9e94e0..ea7fbd0d879d 100644 --- a/arch/tile/include/asm/thread_info.h +++ b/arch/tile/include/asm/thread_info.h @@ -126,6 +126,7 @@ extern void _cpu_idle(void); #define TIF_SYSCALL_TRACEPOINT 9 /* syscall tracepoint instrumentation */ #define TIF_POLLING_NRFLAG 10 /* idle is polling for TIF_NEED_RESCHED */ #define TIF_NOHZ 11 /* in adaptive nohz mode */ +#define TIF_TASK_ISOLATION 12 /* in task isolation mode */ #define _TIF_SIGPENDING (1< #include #include +#include #include #include #include @@ -495,9 +496,17 @@ void prepare_exit_to_usermode(struct pt_regs *regs, u32 thread_info_flags) tracehook_notify_resume(regs); } + if (thread_info_flags & _TIF_TASK_ISOLATION) + task_isolation_enter(); + local_irq_disable(); thread_info_flags = READ_ONCE(current_thread_info()->flags); + /* Clear task isolation from cached_flags manually. */ + if ((thread_info_flags & _TIF_TASK_ISOLATION) && + task_isolation_ready()) + thread_info_flags &= ~_TIF_TASK_ISOLATION; + } while (thread_info_flags & _TIF_WORK_MASK); if (thread_info_flags & _TIF_SINGLESTEP) { diff --git a/arch/tile/kernel/ptrace.c b/arch/tile/kernel/ptrace.c index 54e7b723db99..475a362415fb 100644 --- a/arch/tile/kernel/ptrace.c +++ b/arch/tile/kernel/ptrace.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -255,6 +256,12 @@ int do_syscall_trace_enter(struct pt_regs *regs) { u32 work = ACCESS_ONCE(current_thread_info()->flags); + /* In isolation mode, we may prevent the syscall from running. */ + if (work & _TIF_TASK_ISOLATION) { + if (task_isolation_syscall(regs->regs[TREG_SYSCALL_NR]) == -1) + return -1; + } + if (secure_computing() == -1) return -1; diff --git a/arch/tile/kernel/single_step.c b/arch/tile/kernel/single_step.c index 862973074bf9..3baa7230149e 100644 --- a/arch/tile/kernel/single_step.c +++ b/arch/tile/kernel/single_step.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -320,6 +321,8 @@ void single_step_once(struct pt_regs *regs) int size = 0, sign_ext = 0; /* happy compiler */ int align_ctl; + task_isolation_exception("single step at %#lx", regs->pc); + align_ctl = unaligned_fixup; switch (task_thread_info(current)->align_ctl) { case PR_UNALIGN_NOPRINT: @@ -767,6 +770,8 @@ void single_step_once(struct pt_regs *regs) unsigned long *ss_pc = this_cpu_ptr(&ss_saved_pc); unsigned long control = __insn_mfspr(SPR_SINGLE_STEP_CONTROL_K); + task_isolation_exception("single step at %#lx", regs->pc); + *ss_pc = regs->pc; control |= SPR_SINGLE_STEP_CONTROL_1__CANCELED_MASK; control |= SPR_SINGLE_STEP_CONTROL_1__INHIBIT_MASK; diff --git a/arch/tile/kernel/smp.c b/arch/tile/kernel/smp.c index 07e3ff5cc740..da1eb240fc57 100644 --- a/arch/tile/kernel/smp.c +++ b/arch/tile/kernel/smp.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -67,6 +68,7 @@ void send_IPI_single(int cpu, int tag) .x = cpu % smp_width, .state = HV_TO_BE_SENT }; + task_isolation_debug(cpu); __send_IPI_many(&recip, 1, tag); } @@ -84,6 +86,7 @@ void send_IPI_many(const struct cpumask *mask, int tag) r->x = cpu % smp_width; r->state = HV_TO_BE_SENT; } + task_isolation_debug_cpumask(mask); __send_IPI_many(recip, nrecip, tag); } @@ -181,10 +184,11 @@ void flush_icache_range(unsigned long start, unsigned long end) struct ipi_flush flush = { start, end }; /* If invoked with irqs disabled, we can not issue IPIs. */ - if (irqs_disabled()) + if (irqs_disabled()) { + task_isolation_debug_cpumask(task_isolation_map); flush_remote(0, HV_FLUSH_EVICT_L1I, NULL, 0, 0, 0, NULL, NULL, 0); - else { + } else { preempt_disable(); on_each_cpu(ipi_flush_icache_range, &flush, 1); preempt_enable(); @@ -258,10 +262,8 @@ void __init ipi_init(void) #if CHIP_HAS_IPI() -void smp_send_reschedule(int cpu) +static void __smp_send_reschedule(int cpu) { - WARN_ON(cpu_is_offline(cpu)); - /* * We just want to do an MMIO store. The traditional writeq() * functions aren't really correct here, since they're always @@ -273,15 +275,17 @@ void smp_send_reschedule(int cpu) #else -void smp_send_reschedule(int cpu) +static void __smp_send_reschedule(int cpu) { - HV_Coord coord; - - WARN_ON(cpu_is_offline(cpu)); - - coord.y = cpu_y(cpu); - coord.x = cpu_x(cpu); + HV_Coord coord = { .y = cpu_y(cpu), .x = cpu_x(cpu) }; hv_trigger_ipi(coord, IRQ_RESCHEDULE); } #endif /* CHIP_HAS_IPI() */ + +void smp_send_reschedule(int cpu) +{ + WARN_ON(cpu_is_offline(cpu)); + task_isolation_debug(cpu); + __smp_send_reschedule(cpu); +} diff --git a/arch/tile/kernel/unaligned.c b/arch/tile/kernel/unaligned.c index 0db5f7c9d9e5..754204987532 100644 --- a/arch/tile/kernel/unaligned.c +++ b/arch/tile/kernel/unaligned.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -1545,6 +1546,8 @@ void do_unaligned(struct pt_regs *regs, int vecnum) return; } + task_isolation_exception("unaligned JIT at %#lx", regs->pc); + if (!info->unalign_jit_base) { void __user *user_page; diff --git a/arch/tile/mm/fault.c b/arch/tile/mm/fault.c index 26734214818c..7f910e4061f1 100644 --- a/arch/tile/mm/fault.c +++ b/arch/tile/mm/fault.c @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -844,6 +845,8 @@ static inline void __do_page_fault(struct pt_regs *regs, int fault_num, void do_page_fault(struct pt_regs *regs, int fault_num, unsigned long address, unsigned long write) { + task_isolation_exception("page fault interrupt %d at %#lx (%#lx)", + fault_num, regs->pc, address); __do_page_fault(regs, fault_num, address, write); } diff --git a/arch/tile/mm/homecache.c b/arch/tile/mm/homecache.c index 40ca30a9fee3..e044e8dd8372 100644 --- a/arch/tile/mm/homecache.c +++ b/arch/tile/mm/homecache.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -83,6 +84,7 @@ static void hv_flush_update(const struct cpumask *cache_cpumask, * Don't bother to update atomically; losing a count * here is not that critical. */ + task_isolation_debug_cpumask(&mask); for_each_cpu(cpu, &mask) ++per_cpu(irq_stat, cpu).irq_hv_flush_count; } -- 2.7.2