Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp3383511ybp; Sun, 6 Oct 2019 10:43:54 -0700 (PDT) X-Google-Smtp-Source: APXvYqxFGlWQfDj91mmjdXXJ0ZUq1hXhkda7Aihe6pXIcICKR7rPit59Wvz9O2EYBf6cVLeLoYXb X-Received: by 2002:aa7:c5c1:: with SMTP id h1mr25068868eds.10.1570383834079; Sun, 06 Oct 2019 10:43:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570383834; cv=none; d=google.com; s=arc-20160816; b=aqnG+WSvhJui9VUtKeD26Y6DxxrnAfnw2ukSd3df83nUaG41zb6cNi2DA37E5yYmkW cH0/xuD+enAXFqx+N+7HCT0yUpxgXAzJaUKfQYT7m4/y+RbAWThW8WxMtI9f8CRcs0MT 6EJNPOD1+1ehkIfSdlBOt1y6jEKJBnJ6qan3ubVJ7ce6lG19VHJtSC0LNb62ybMJk/kb 2QbUKPdM6VZpBdJ5mClmVYxc+8X9WzImpgLUzR/LNaGr8UI+083NDOCoz9jh/u9RrR/o OiySdiYarG4v+eLZFDnoLZf+O3u+ABJ24vjvaV/c5u9ddRXQIsckWVIqAOLQW0owI0fy Gy+g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=cq2mOJglR1n/35dD34mZoqr+t6CKpOe+c0wI8eKJ5VU=; b=k352Wv3kGc6E7c/hx8Kgqf6Fd29dZ++AFnK83jSKexsZnQiEu4hNHUTFZCrzOmwoXV mMeUzHGbJsH2SQhL65k/vFfvoT25rJE50LNU5VqVMBk40wcZGsbjBrdA5e3NRUWbgswD SEf1eD1TuCAgOIPCxEI4N9NcfOY7V8gpQlfFzpfxJbLnnAdy2RDCSM6VUmNI1/oQvq0b e4hdYX/jIgP70qsjaPwBXsJpoDPZKAIqmVtQzQRkY6wM1ritpUYRb5JoYvkFpLwpsamX 9yn9V4J8RDV8WWU3tptKNVpRVZO+ip5+MrNTTtMwLv7qdDQNEobgXvkMfjhj1hiDJK0z LwsQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=mhBq4Yze; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f57si7374284ede.78.2019.10.06.10.43.30; Sun, 06 Oct 2019 10:43:54 -0700 (PDT) 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; dkim=pass header.i=@kernel.org header.s=default header.b=mhBq4Yze; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730025AbfJFRj5 (ORCPT + 99 others); Sun, 6 Oct 2019 13:39:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:39400 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730089AbfJFRjz (ORCPT ); Sun, 6 Oct 2019 13:39:55 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (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 7744B2087E; Sun, 6 Oct 2019 17:39:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570383595; bh=bL9gZIONi5x1sP8K0K9+7JkjNGb4N9JAG6j5LpCsJzM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mhBq4YzeybhO1IFHca3bv24k02PJ3kKxJgipvmJjpJwgpPaw8Wkdcdnv/wSsscn4e WJEJ7rZSWJVDxx9E+Hng8XjcHfYxyHTxJxZSGB2c7bfP9MRHZ3FtFhxcqimb5VZ8En yE9tZx5nuCXZKxuGtH7xF/QMy3jI5SGO8afZnllQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Corey Minyard , Sasha Levin Subject: [PATCH 5.3 024/166] ipmi_si: Only schedule continuously in the thread in maintenance mode Date: Sun, 6 Oct 2019 19:19:50 +0200 Message-Id: <20191006171215.188421890@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191006171212.850660298@linuxfoundation.org> References: <20191006171212.850660298@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Corey Minyard [ Upstream commit 340ff31ab00bca5c15915e70ad9ada3030c98cf8 ] ipmi_thread() uses back-to-back schedule() to poll for command completion which, on some machines, can push up CPU consumption and heavily tax the scheduler locks leading to noticeable overall performance degradation. This was originally added so firmware updates through IPMI would complete in a timely manner. But we can't kill the scheduler locks for that one use case. Instead, only run schedule() continuously in maintenance mode, where firmware updates should run. Signed-off-by: Corey Minyard Signed-off-by: Sasha Levin --- drivers/char/ipmi/ipmi_si_intf.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index da5b6723329a9..28693dbcb0c38 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c @@ -221,6 +221,9 @@ struct smi_info { */ bool irq_enable_broken; + /* Is the driver in maintenance mode? */ + bool in_maintenance_mode; + /* * Did we get an attention that we did not handle? */ @@ -1007,11 +1010,20 @@ static int ipmi_thread(void *data) spin_unlock_irqrestore(&(smi_info->si_lock), flags); busy_wait = ipmi_thread_busy_wait(smi_result, smi_info, &busy_until); - if (smi_result == SI_SM_CALL_WITHOUT_DELAY) + if (smi_result == SI_SM_CALL_WITHOUT_DELAY) { ; /* do nothing */ - else if (smi_result == SI_SM_CALL_WITH_DELAY && busy_wait) - schedule(); - else if (smi_result == SI_SM_IDLE) { + } else if (smi_result == SI_SM_CALL_WITH_DELAY && busy_wait) { + /* + * In maintenance mode we run as fast as + * possible to allow firmware updates to + * complete as fast as possible, but normally + * don't bang on the scheduler. + */ + if (smi_info->in_maintenance_mode) + schedule(); + else + usleep_range(100, 200); + } else if (smi_result == SI_SM_IDLE) { if (atomic_read(&smi_info->need_watch)) { schedule_timeout_interruptible(100); } else { @@ -1019,8 +1031,9 @@ static int ipmi_thread(void *data) __set_current_state(TASK_INTERRUPTIBLE); schedule(); } - } else + } else { schedule_timeout_interruptible(1); + } } return 0; } @@ -1198,6 +1211,7 @@ static void set_maintenance_mode(void *send_info, bool enable) if (!enable) atomic_set(&smi_info->req_events, 0); + smi_info->in_maintenance_mode = enable; } static void shutdown_smi(void *send_info); -- 2.20.1