Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp366473pxx; Wed, 28 Oct 2020 06:50:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy/q8hoaQWwfsdFF+lTzH7Uggidw9kYpQNBiQlr5UfOYTeSSBrceMbxDTCIX0RdJMMcCvdj X-Received: by 2002:a17:906:7fd7:: with SMTP id r23mr7388049ejs.310.1603893034814; Wed, 28 Oct 2020 06:50:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1603893034; cv=none; d=google.com; s=arc-20160816; b=ERkGpIUF1rEhvD/HopA54ZYJfeQqXO0m/tDawNaPwvffMM40kdC3zrnA5UC+6EMj4n VfXwLtCTKpahbXYQ3DoqVCjh88C+GXErW12uP6CR++Etw/J0kCL5h5AD8sbFNcgUEtSJ Qzk+nkQqP1dfO1TXpIiamy4sDYNcUIdbtNdJEWqCgFkM6Jh8Lx3/rgF1KmXz4pEFzffi 6N+hzSqP3zGAXxoDlauEwBlpxzSFtFsSJEApg1/V/S7ecbnsiGhuOMn4caNfCASgXLkf 8lDp2U0G+pS6SsM/I2wb4LaloQqjpwAQh8hwh5ry+OvASzfhfhWF1UmPpA5CgK1dcNfC 0Izg== 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=o+o9YcYT1P3SKI7lDZZSb5Ja3TJ5I6rxXpdDxQYrlmk=; b=xVq8c8u63OtBHrkciMzSKvuiEZd5O/kgdgJi3Y9Yy3s717z1dAgqkSyejcb1XSZRIf oP2E/Vvki8+d7/6w475Zzv+80Hm7hHMfcL4FwvcyWEv4ZcLd6gNBudGCP3KJ8nyHI+La SVBjVkw7pg3SaqB/QWoCMxhXxa3WHkZYpXulp3u62JFhuUHNy1QE81OJfiU/TSHy7K/J Z4NW63o3rZnKLXI5CwPtg2hlQU6ScR8HWz5zfR+0OY8jpPXv3EA1IlAsnDrjvPocXNd9 VYO3hFQOGmEVeODSp90uFwVwzhL3PNI5neZRxdT9tSFxZaSNXKIuGMZhpQg/l/ho+8eH MVVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=kUbPLu+s; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id o10si2705925ejr.482.2020.10.28.06.50.12; Wed, 28 Oct 2020 06:50:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=kUbPLu+s; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1803254AbgJ0Pw3 (ORCPT + 99 others); Tue, 27 Oct 2020 11:52:29 -0400 Received: from mail.kernel.org ([198.145.29.99]:57858 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1801069AbgJ0Pid (ORCPT ); Tue, 27 Oct 2020 11:38:33 -0400 Received: from localhost (83-86-74-64.cable.dynamic.v4.ziggo.nl [83.86.74.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 0A947207C4; Tue, 27 Oct 2020 15:38:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1603813112; bh=eivYdcrFuNlrjgs500gpGET33Ex5/2Ziv8C9PRo5HS4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kUbPLu+sVmTTpmPjGuE1Ii0+GhhC/aLiSCy3+nF6QYqsP2Di91aymecDJ58/yrlLn 2xNTQd1LCKWxHe0J/SE+wZH+vPVplalZanNtJvzC2+9mv3QxAtaPLaWM7FcRH0kXn8 BYpyObaJCEF4R+FwEGXFM9xItedAgPf6JepSUw0I= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nathan Lynch , Christophe Leroy , Michael Ellerman , Sasha Levin Subject: [PATCH 5.9 411/757] powerpc/pseries: explicitly reschedule during drmem_lmb list traversal Date: Tue, 27 Oct 2020 14:51:01 +0100 Message-Id: <20201027135509.845370127@linuxfoundation.org> X-Mailer: git-send-email 2.29.1 In-Reply-To: <20201027135450.497324313@linuxfoundation.org> References: <20201027135450.497324313@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nathan Lynch [ Upstream commit 9d6792ffe140240ae54c881cc4183f9acc24b4df ] The drmem lmb list can have hundreds of thousands of entries, and unfortunately lookups take the form of linear searches. As long as this is the case, traversals have the potential to monopolize the CPU and provoke lockup reports, workqueue stalls, and the like unless they explicitly yield. Rather than placing cond_resched() calls within various for_each_drmem_lmb() loop blocks in the code, put it in the iteration expression of the loop macro itself so users can't omit it. Introduce a drmem_lmb_next() iteration helper function which calls cond_resched() at a regular interval during array traversal. Each iteration of the loop in DLPAR code paths can involve around ten RTAS calls which can each take up to 250us, so this ensures the check is performed at worst every few milliseconds. Fixes: 6c6ea53725b3 ("powerpc/mm: Separate ibm, dynamic-memory data from DT format") Signed-off-by: Nathan Lynch Reviewed-by: Christophe Leroy Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/20200813151131.2070161-1-nathanl@linux.ibm.com Signed-off-by: Sasha Levin --- arch/powerpc/include/asm/drmem.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/include/asm/drmem.h b/arch/powerpc/include/asm/drmem.h index 17ccc6474ab6f..6fb928605ed13 100644 --- a/arch/powerpc/include/asm/drmem.h +++ b/arch/powerpc/include/asm/drmem.h @@ -8,6 +8,8 @@ #ifndef _ASM_POWERPC_LMB_H #define _ASM_POWERPC_LMB_H +#include + struct drmem_lmb { u64 base_addr; u32 drc_index; @@ -26,8 +28,22 @@ struct drmem_lmb_info { extern struct drmem_lmb_info *drmem_info; +static inline struct drmem_lmb *drmem_lmb_next(struct drmem_lmb *lmb, + const struct drmem_lmb *start) +{ + /* + * DLPAR code paths can take several milliseconds per element + * when interacting with firmware. Ensure that we don't + * unfairly monopolize the CPU. + */ + if (((++lmb - start) % 16) == 0) + cond_resched(); + + return lmb; +} + #define for_each_drmem_lmb_in_range(lmb, start, end) \ - for ((lmb) = (start); (lmb) < (end); (lmb)++) + for ((lmb) = (start); (lmb) < (end); lmb = drmem_lmb_next(lmb, start)) #define for_each_drmem_lmb(lmb) \ for_each_drmem_lmb_in_range((lmb), \ -- 2.25.1