Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp1299761imu; Wed, 9 Jan 2019 15:35:46 -0800 (PST) X-Google-Smtp-Source: ALg8bN4RMt18ydhIMni3QaiipFGOmYungHFgXaAdeKuYOzBHNRQR+q9LIqy7KnR2lP02D09JXHcD X-Received: by 2002:a63:1a0c:: with SMTP id a12mr7118903pga.157.1547076946791; Wed, 09 Jan 2019 15:35:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547076946; cv=none; d=google.com; s=arc-20160816; b=IhpHxPO2YYKO0e3MEDCz1JK1DGwsisLYKDv73Ic95JCtg+JgxRpmIuKBYZdsWLBUEL nVJoxa0dAbSqs0XEX2lV0SwTZAXHi+PhcPO6HiHIa4Lpy6qxD5nayXUbDCHa7geISusJ jOOOGKlfbvrQnv2DRVbPslbulfz7z+8/dvCFduozXXSA42XCV0VBLszKI5dZf5sVOQhO WTVh0oOqqg05gieBEqweTRdr9HSDbuiHBWUI0Tuj/LiFWs3B2LZGaG7SHsUOOhoQuGqJ ZD5RS+KKNbtkQavxrZCQgEK4C6XqeSlWpTda+L8Elu7BwKb64L/IJwaxSjxSG6FvsxJM jQ/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=twet7E/6yoi1jS9hIPR8cY7HPyJ3G8BwTvnytWjRmzY=; b=M47YbpofIzPIECx6pb8dFiW63H4+4FTuRjN9QSC57oUG1InaAMziWmwTEcYgjWL/5K wKT7yo8qJIKvxIl5DITCt12HvMPDy2FQPxgrKot6pvDCYFObYNwsm6KZfPNw1IJ3ex+j f1xvH8QgyikPb56iatE7K4VhcZsyzKTkOwY/vpTXMXrdiIr6jl97V3OQ4zfJy0IdvJ++ vcnj/MJY2abbBQrpLwbg6kWA30Pow1P5iUvrN3/NN59jlm+y8b4nsoxmnJqdV6ctNSDY cetbpQz0GDKfrktkxJ/3r0+yAUBt9eseaBBfx5kFJiOwnDamJ2+OK7QideB+5Sjfo2Ua lE1A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b6si3405701pls.367.2019.01.09.15.35.17; Wed, 09 Jan 2019 15:35:46 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727024AbfAIXAO (ORCPT + 99 others); Wed, 9 Jan 2019 18:00:14 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51404 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726094AbfAIXAN (ORCPT ); Wed, 9 Jan 2019 18:00:13 -0500 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9C6C2C070E05; Wed, 9 Jan 2019 23:00:11 +0000 (UTC) Received: from treble.redhat.com (ovpn-125-32.rdu2.redhat.com [10.10.125.32]) by smtp.corp.redhat.com (Postfix) with ESMTP id 98492100034B; Wed, 9 Jan 2019 23:00:01 +0000 (UTC) From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, Ard Biesheuvel , Andy Lutomirski , Steven Rostedt , Peter Zijlstra , Ingo Molnar , Thomas Gleixner , Linus Torvalds , Masami Hiramatsu , Jason Baron , Jiri Kosina , David Laight , Borislav Petkov , Julia Cartwright , Jessica Yu , "H. Peter Anvin" , Nadav Amit , Rasmus Villemoes , Edward Cree , Daniel Bristot de Oliveira Subject: [PATCH v3 5/6] x86/alternative: Use a single access in text_poke() where possible Date: Wed, 9 Jan 2019 16:59:40 -0600 Message-Id: <279b8003f7f0a6831d090ab822d37bc958f974de.1547073843.git.jpoimboe@redhat.com> In-Reply-To: References: X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 09 Jan 2019 23:00:13 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Static call inline patching will need to use single 32-bit writes. Change text_poke() to do so where possible. Signed-off-by: Josh Poimboeuf --- arch/x86/kernel/alternative.c | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c index ebeac487a20c..607f48a90097 100644 --- a/arch/x86/kernel/alternative.c +++ b/arch/x86/kernel/alternative.c @@ -692,7 +692,7 @@ void *__init_or_module text_poke_early(void *addr, const void *opcode, void *text_poke(void *addr, const void *opcode, size_t len) { unsigned long flags; - char *vaddr; + unsigned long vaddr; struct page *pages[2]; int i; @@ -714,14 +714,39 @@ void *text_poke(void *addr, const void *opcode, size_t len) } BUG_ON(!pages[0]); local_irq_save(flags); + set_fixmap(FIX_TEXT_POKE0, page_to_phys(pages[0])); if (pages[1]) set_fixmap(FIX_TEXT_POKE1, page_to_phys(pages[1])); - vaddr = (char *)fix_to_virt(FIX_TEXT_POKE0); - memcpy(&vaddr[(unsigned long)addr & ~PAGE_MASK], opcode, len); + + vaddr = fix_to_virt(FIX_TEXT_POKE0) + ((unsigned long)addr & ~PAGE_MASK); + + /* + * Use a single access where possible. Note that a single unaligned + * multi-byte write will not necessarily be atomic on x86-32, or if the + * address crosses a cache line boundary. + */ + switch (len) { + case 1: + WRITE_ONCE(*(u8 *)vaddr, *(u8 *)opcode); + break; + case 2: + WRITE_ONCE(*(u16 *)vaddr, *(u16 *)opcode); + break; + case 4: + WRITE_ONCE(*(u32 *)vaddr, *(u32 *)opcode); + break; + case 8: + WRITE_ONCE(*(u64 *)vaddr, *(u64 *)opcode); + break; + default: + memcpy((void *)vaddr, opcode, len); + } + clear_fixmap(FIX_TEXT_POKE0); if (pages[1]) clear_fixmap(FIX_TEXT_POKE1); + local_flush_tlb(); sync_core(); /* Could also do a CLFLUSH here to speed up CPU recovery; but -- 2.17.2