Received: by 2002:a05:6a10:6d10:0:0:0:0 with SMTP id gq16csp827451pxb; Tue, 12 Apr 2022 14:34:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwtqqn79RZrPnisEmguuLZApbG1t4JNU6yLW/879SRzZtbMuJnpsUVPxfwycmGDL6NKlOna X-Received: by 2002:a17:902:70c1:b0:154:667f:e361 with SMTP id l1-20020a17090270c100b00154667fe361mr39759368plt.148.1649799294696; Tue, 12 Apr 2022 14:34:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649799294; cv=none; d=google.com; s=arc-20160816; b=T2G+au0i7WpNYSKeHrWwLEDKWDGf5kUBTmfcG2z5YWv5oGb6UCkCpA3I8xcKcZr5FC LEcPcmahOwcanydOKLT4XNKG7AwfGnWEJwYKPsrjxFEkeEt40VULgOsfiTVDrJDx9FHm OOYnfxMM25ydDt9I1e+QwKVicz7PbW1f00aKTE1kjQWdQiLgOlOJNHC6Z//szqaHagSd MsGqzU4E6bN9VPUtdyp7btdtU5PnUlBzocxAJ827P2KteD6Yj+tFIyYPBvnVv6JPVHIM kzqNN8eFitB11I/M7wZE2eRH53e5RqR9A7PcxnQ8RcZCHILADpjVdUBam8OIthdKdfAM LHaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=zqXH54g/tJb2JYLsEZ6roMagtzUjqWLb0A5Em3zm2pQ=; b=U06HpWVmAYRAv2RJRWzzlywVPAQ3JORZww1sTp3rjYaGDuJJZM4divg5zLKbzJLOEW RNguk3Wo7wsiM+pB2jeU6KYccn8OQO2JKZAxczuREh8Md+of6gC/Iro+RYAa0vqaYWrS mF8pHLfDpnySh1Kl3pgx6b6sAgFYKhnHhaPo8BMbUhuar/zQ5lvHHwLGwrqInHdXFpdK V4kYj1JqEEwRFouQmVNMlbZUgwDkt98/rhrbr6mbBGCHrzbm8vsaygKx+bn+kryLqgPr 0CMwUHwds5DblXR9hwfnm1IRQ4QczqjBmlP5lrhGT7iCcYBjiohjXh8AQJTHkrBIoExn LsNQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="dthP9/2r"; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id c5-20020a170902d48500b00155c9c5be01si3190496plg.570.2022.04.12.14.34.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Apr 2022 14:34:54 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b="dthP9/2r"; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id D56E7117990; Tue, 12 Apr 2022 13:40:32 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1350524AbiDLGmD (ORCPT + 99 others); Tue, 12 Apr 2022 02:42:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51704 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1350133AbiDLGkR (ORCPT ); Tue, 12 Apr 2022 02:40:17 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B374B369CD; Mon, 11 Apr 2022 23:35:27 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 4E5146189D; Tue, 12 Apr 2022 06:35:27 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5BCE4C385A1; Tue, 12 Apr 2022 06:35:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1649745326; bh=lvv8cnTI6BktFXnIitlRU47v3AeI21a/XvYefVF/WZc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=dthP9/2rZD3YHQzu2UjhSeGHFSObnqtk+U6Upq/HtyBYl8irYs5ozp0rcc4b1UIzD BqryUeNe6wwaOuGTohPJ1Rz4ELsK6ugyoBHQe32tYuuwuaBt6IwJn9t46r+hO7Yomq aRcQZBd1UGUpNiUEMZxaQ53Ez0JypOeTNp6Y8dFI= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Paul Menzel , Christophe Leroy , Michael Ellerman , Sasha Levin , Peter Zijlstra Subject: [PATCH 5.10 057/171] powerpc/code-patching: Pre-map patch area Date: Tue, 12 Apr 2022 08:29:08 +0200 Message-Id: <20220412062929.532622482@linuxfoundation.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220412062927.870347203@linuxfoundation.org> References: <20220412062927.870347203@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Michael Ellerman [ Upstream commit 591b4b268435f00d2f0b81f786c2c7bd5ef66416 ] Paul reported a warning with DEBUG_ATOMIC_SLEEP=y: BUG: sleeping function called from invalid context at include/linux/sched/mm.h:256 in_atomic(): 0, irqs_disabled(): 1, non_block: 0, pid: 1, name: swapper/0 preempt_count: 0, expected: 0 ... Call Trace: dump_stack_lvl+0xa0/0xec (unreliable) __might_resched+0x2f4/0x310 kmem_cache_alloc+0x220/0x4b0 __pud_alloc+0x74/0x1d0 hash__map_kernel_page+0x2cc/0x390 do_patch_instruction+0x134/0x4a0 arch_jump_label_transform+0x64/0x78 __jump_label_update+0x148/0x180 static_key_enable_cpuslocked+0xd0/0x120 static_key_enable+0x30/0x50 check_kvm_guest+0x60/0x88 pSeries_smp_probe+0x54/0xb0 smp_prepare_cpus+0x3e0/0x430 kernel_init_freeable+0x20c/0x43c kernel_init+0x30/0x1a0 ret_from_kernel_thread+0x5c/0x64 Peter pointed out that this is because do_patch_instruction() has disabled interrupts, but then map_patch_area() calls map_kernel_page() then hash__map_kernel_page() which does a sleeping memory allocation. We only see the warning in KVM guests with SMT enabled, which is not particularly common, or on other platforms if CONFIG_KPROBES is disabled, also not common. The reason we don't see it in most configurations is that another path that happens to have interrupts enabled has allocated the required page tables for us, eg. there's a path in kprobes init that does that. That's just pure luck though. As Christophe suggested, the simplest solution is to do a dummy map/unmap when we initialise the patching, so that any required page table levels are pre-allocated before the first call to do_patch_instruction(). This works because the unmap doesn't free any page tables that were allocated by the map, it just clears the PTE, leaving the page table levels there for the next map. Reported-by: Paul Menzel Debugged-by: Peter Zijlstra Suggested-by: Christophe Leroy Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/20220223015821.473097-1-mpe@ellerman.id.au Signed-off-by: Sasha Levin --- arch/powerpc/lib/code-patching.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/arch/powerpc/lib/code-patching.c b/arch/powerpc/lib/code-patching.c index a2e4f864b63d..4318aee65a39 100644 --- a/arch/powerpc/lib/code-patching.c +++ b/arch/powerpc/lib/code-patching.c @@ -43,9 +43,14 @@ int raw_patch_instruction(struct ppc_inst *addr, struct ppc_inst instr) #ifdef CONFIG_STRICT_KERNEL_RWX static DEFINE_PER_CPU(struct vm_struct *, text_poke_area); +static int map_patch_area(void *addr, unsigned long text_poke_addr); +static void unmap_patch_area(unsigned long addr); + static int text_area_cpu_up(unsigned int cpu) { struct vm_struct *area; + unsigned long addr; + int err; area = get_vm_area(PAGE_SIZE, VM_ALLOC); if (!area) { @@ -53,6 +58,15 @@ static int text_area_cpu_up(unsigned int cpu) cpu); return -1; } + + // Map/unmap the area to ensure all page tables are pre-allocated + addr = (unsigned long)area->addr; + err = map_patch_area(empty_zero_page, addr); + if (err) + return err; + + unmap_patch_area(addr); + this_cpu_write(text_poke_area, area); return 0; -- 2.35.1