Received: by 10.192.165.156 with SMTP id m28csp1125514imm; Wed, 11 Apr 2018 12:56:11 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+kLEBkv5KdONwe0CV9fa86rNZKyt9fCgM7+4fW9jjB844KWuxmskj+9nad/ABpTWUCrVMR X-Received: by 10.98.66.203 with SMTP id h72mr5144130pfd.156.1523476571123; Wed, 11 Apr 2018 12:56:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523476571; cv=none; d=google.com; s=arc-20160816; b=R+QQGjLE7q6KNDoq98vgFqPJCyPk65RrrxStKFVzDJuu5Zu489EE8UX0gvEZwEdpda X5j4YD9IAWW+rsmhdPycpL8ycOgsiLvjZrpNQQavJZ5jAW7EZ80Pv03RGfDOpQZVgwyW R5NR0WsdI9LtZeGq7c4cx+TeSHbkiqZbAxRcDZ/r8/lhGnPdaoqmqorgC2tK0fH92OsB gt3etWhynUkCWBI8gw39mpYZq1K0ArylN3GU/iCTWAi+BW0HWzjSECZYJrDS0yzKe91i dBJ2QcP2XgjnIroHEqfOqlu5immSaBtTZ7qR6/EunCA416qw62SGncbopp3Gh+XdjTIV gTqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=eFTm3Chj4FW1C71v5RNNFjSjP+3jRATP9QJqF0aNjbQ=; b=qEeTtTJRWHehd7ITxFWKG5fkplp/zPoA/jFvVaWJJkuerUjlwf3r0UpzhaVMPuRN32 KEOHu4b3mtAsRH/9ti9icOPTLE2iDvplfPpFLaEPdRuEz+NEXfZL3aXXrXQ28qDQu4Nj i9jDEK6E2kOeniKagAxVIX6ydJ3c7Yp5eH780BxawGwqoDFG+xMvUIZoLI+ylD/4IofI o1f0BHjr/2r7nWMKzddabf+mUlqGB6MbJffWz1hKYFZypwKzVr2SXdcoLWPhhd9Z3vlN W3a9tLr5GwM//uQrsmn9tKx9IENyzPWeXA88X8Vv0ZyNJVaBv0MqoKuHbz2CCyPKPURz aoEg== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i1-v6si1688218plt.5.2018.04.11.12.55.34; Wed, 11 Apr 2018 12:56:11 -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; 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 S933208AbeDKS6D (ORCPT + 99 others); Wed, 11 Apr 2018 14:58:03 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:36502 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932601AbeDKS6A (ORCPT ); Wed, 11 Apr 2018 14:58:00 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id CE155D9E; Wed, 11 Apr 2018 18:57:59 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Yi Zeng , Zhang Rui , Sasha Levin Subject: [PATCH 4.9 122/310] thermal: power_allocator: fix one race condition issue for thermal_instances list Date: Wed, 11 Apr 2018 20:34:21 +0200 Message-Id: <20180411183627.411499905@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180411183622.305902791@linuxfoundation.org> References: <20180411183622.305902791@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Yi Zeng [ Upstream commit a5de11d67dcd268b8d0beb73dc374de5e97f0caf ] When invoking allow_maximum_power and traverse tz->thermal_instances, we should grab thermal_zone_device->lock to avoid race condition. For example, during the system reboot, if the mali GPU device implements device shutdown callback and unregister GPU devfreq cooling device, the deleted list head may be accessed to cause panic, as the following log shows: [ 33.551070] c3 25 (kworker/3:0) Unable to handle kernel paging request at virtual address dead000000000070 [ 33.566708] c3 25 (kworker/3:0) pgd = ffffffc0ed290000 [ 33.572071] c3 25 (kworker/3:0) [dead000000000070] *pgd=00000001ed292003, *pud=00000001ed292003, *pmd=0000000000000000 [ 33.581515] c3 25 (kworker/3:0) Internal error: Oops: 96000004 [#1] PREEMPT SMP [ 33.599761] c3 25 (kworker/3:0) CPU: 3 PID: 25 Comm: kworker/3:0 Not tainted 4.4.35+ #912 [ 33.614137] c3 25 (kworker/3:0) Workqueue: events_freezable thermal_zone_device_check [ 33.620245] c3 25 (kworker/3:0) task: ffffffc0f32e4200 ti: ffffffc0f32f0000 task.ti: ffffffc0f32f0000 [ 33.629466] c3 25 (kworker/3:0) PC is at power_allocator_throttle+0x7c8/0x8a4 [ 33.636609] c3 25 (kworker/3:0) LR is at power_allocator_throttle+0x808/0x8a4 [ 33.643742] c3 25 (kworker/3:0) pc : [] lr : [] pstate: 20000145 [ 33.652874] c3 25 (kworker/3:0) sp : ffffffc0f32f3bb0 [ 34.468519] c3 25 (kworker/3:0) Process kworker/3:0 (pid: 25, stack limit = 0xffffffc0f32f0020) [ 34.477220] c3 25 (kworker/3:0) Stack: (0xffffffc0f32f3bb0 to 0xffffffc0f32f4000) [ 34.819822] c3 25 (kworker/3:0) Call trace: [ 34.824021] c3 25 (kworker/3:0) Exception stack(0xffffffc0f32f39c0 to 0xffffffc0f32f3af0) [ 34.924993] c3 25 (kworker/3:0) [] power_allocator_throttle+0x7c8/0x8a4 [ 34.933184] c3 25 (kworker/3:0) [] handle_thermal_trip.part.25+0x70/0x224 [ 34.941545] c3 25 (kworker/3:0) [] thermal_zone_device_update+0xc0/0x20c [ 34.949818] c3 25 (kworker/3:0) [] thermal_zone_device_check+0x20/0x2c [ 34.957924] c3 25 (kworker/3:0) [] process_one_work+0x168/0x458 [ 34.965414] c3 25 (kworker/3:0) [] worker_thread+0x13c/0x4b4 [ 34.972650] c3 25 (kworker/3:0) [] kthread+0xe8/0xfc [ 34.979187] c3 25 (kworker/3:0) [] ret_from_fork+0x10/0x40 [ 34.986244] c3 25 (kworker/3:0) Code: f9405e73 eb1302bf d102e273 54ffc460 (b9402a61) [ 34.994339] c3 25 (kworker/3:0) ---[ end trace 32057901e3b7e1db ]--- Signed-off-by: Yi Zeng Signed-off-by: Zhang Rui Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- drivers/thermal/power_allocator.c | 2 ++ 1 file changed, 2 insertions(+) --- a/drivers/thermal/power_allocator.c +++ b/drivers/thermal/power_allocator.c @@ -523,6 +523,7 @@ static void allow_maximum_power(struct t struct thermal_instance *instance; struct power_allocator_params *params = tz->governor_data; + mutex_lock(&tz->lock); list_for_each_entry(instance, &tz->thermal_instances, tz_node) { if ((instance->trip != params->trip_max_desired_temperature) || (!cdev_is_power_actor(instance->cdev))) @@ -534,6 +535,7 @@ static void allow_maximum_power(struct t mutex_unlock(&instance->cdev->lock); thermal_cdev_update(instance->cdev); } + mutex_unlock(&tz->lock); } /**