Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933171AbeAHVJo (ORCPT + 1 other); Mon, 8 Jan 2018 16:09:44 -0500 Received: from mail-oi0-f65.google.com ([209.85.218.65]:36876 "EHLO mail-oi0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933118AbeAHVJj (ORCPT ); Mon, 8 Jan 2018 16:09:39 -0500 X-Google-Smtp-Source: ACJfBot/nkmlzqIin1LB/yHA88M/12RAOTnv++IlQrQErZQngsrYg29HTHk6FOCRfjsA0LSIt+GLSBtPApmWJBsy30M= MIME-Version: 1.0 In-Reply-To: References: <151520099201.32271.4677179499894422956.stgit@dwillia2-desk3.amr.corp.intel.com> <151520102670.32271.8447983009852138826.stgit@dwillia2-desk3.amr.corp.intel.com> From: Dan Williams Date: Mon, 8 Jan 2018 13:09:37 -0800 Message-ID: Subject: Re: [PATCH 06/18] x86, barrier: stop speculation for failed access_ok To: Linus Torvalds Cc: Linux Kernel Mailing List , linux-arch@vger.kernel.org, Andi Kleen , Arnd Bergmann , Greg Kroah-Hartman , Peter Zijlstra , Network Development , "the arch/x86 maintainers" , Ingo Molnar , "H. Peter Anvin" , Thomas Gleixner , Alan Cox Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: On Sat, Jan 6, 2018 at 5:20 PM, Linus Torvalds wrote: > On Sat, Jan 6, 2018 at 3:31 PM, Dan Williams wrote: >> >> I assume if we put this in uaccess_begin() we also need audit for >> paths that use access_ok but don't do on to call uaccess_begin()? A >> quick glance shows a few places where we are open coding the stac(). >> Perhaps land the lfence in stac() directly? > > Yeah, we should put it in uaccess_begin(), and in the actual user > accessor helpers that do stac. Some of them probably should be changed > to use uaccess_begin() instead while at it. > > One question for the CPU people: do we actually care and need to do > this for things that might *write* to something? The speculative write > obviously is killed, but does it perhaps bring in a cacheline even > when killed? As far as I understand a write could trigger a request-for-ownership read for the target cacheline. > Because maybe we don't need the lfence in put_user(), only in get_user()? Even though writes can trigger reads, as far as I can see the write needs to be dependent on the first out-of-bounds read: if (x < max) y = array1[x]; put_user(array2 + y, z); ...in other words that first read should be annotated with nospec_array_ptr() making an lfence in put_user() or other writes moot. yp = nospec_array_ptr(array1, x, max); if (yp) y = *yp; put_user(array2 + y, z);