Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751791AbbLUREj (ORCPT ); Mon, 21 Dec 2015 12:04:39 -0500 Received: from mga03.intel.com ([134.134.136.65]:49381 "EHLO mga03.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751726AbbLUREh (ORCPT ); Mon, 21 Dec 2015 12:04:37 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,460,1444719600"; d="scan'208";a="876094138" Subject: Re: Rethinking sigcontext's xfeatures slightly for PKRU's benefit? To: Andy Lutomirski , Linus Torvalds References: <5673750B.606@linux.intel.com> <567453AF.5060808@linux.intel.com> <56746774.8000707@linux.intel.com> <567476CC.8080805@linux.intel.com> Cc: "H. Peter Anvin" , Oleg Nesterov , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Brian Gerst , "linux-kernel@vger.kernel.org" , Christoph Hellwig From: Dave Hansen Message-ID: <5678310D.2010104@linux.intel.com> Date: Mon, 21 Dec 2015 09:04:13 -0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1747 Lines: 40 On 12/18/2015 03:16 PM, Andy Lutomirski wrote: > Hrm. We might also want an option to change pkru and/or baseline_pkru > in all threads in the current mm. That's optional but it could be > handy. Maybe it would be as simple as having the allocate-a-pkey call > have an option to set an initial baseline value and an option to > propagate that initial value to pre-existing threads. Do you mean actively going in and changing PKRU in other threads? I fear that will be dangerous. IMNHO, whatever we do, I think we need to ensure that _raw_ PKRU calls are allowed (somehow). Raw in this case would mean a thread calling WRPKRU without a system call and without checking in with what any other threads are doing. Let's say baseline_pkru=0x004 (we're access-disabling PKEY[1] and using it for execute-only). Now, a thread is trying to do this: pkey2 = sys_pkey_alloc(); // now pkey2=2 tmp = rdpkru(); // 0x004 tmp |= 0x10; // set PKRU[2].AD=1 wrpkru(tmp); While another thread does: pkey4 = pkey_alloc(); // pkey4=4 sys_pkey_set(pkey4, ACCESS_DISABLE, SET_BASELINE_ALL_THREADS); Without some kind of locking, that's going to race. We could do all the locking in the kernel, but that requires that the kernel do all the PKRU writing, which I'd really like to avoid. I think the closest we can get reasonably is to have the kernel track the baseline_pkru and then allow userspace to query it in case userspace decides that thread needs to update its thread-local PKRU from the baseline. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/