Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp7283953ybl; Wed, 15 Jan 2020 19:32:21 -0800 (PST) X-Google-Smtp-Source: APXvYqxOjtTdcqsvS2yRK0wImu2CxneAt5+fFd0fwZBP1NGtf4hdwkPFnUd2maz9U+mitpvXUkty X-Received: by 2002:a9d:6b8a:: with SMTP id b10mr414887otq.322.1579145541848; Wed, 15 Jan 2020 19:32:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1579145541; cv=none; d=google.com; s=arc-20160816; b=ZlFQBehT1YZCZrSVxJqPnFNV4ddKYHSXugl4I9iFCmfdydXr4walr/QpAdSlyOhs8F fZTPxdsi/1UHoPSzT8ot7yp6MQzr6CtvHJ7HbZmamEgfukFq80oD3ZSbwVxiDwhf2yuv aMUKt3aQCaVVBP7Gl0PsdB5SeakgrEfqt5rJGfBU9enogMvF0UZvOcnUn5UG9QQ4rMms 4Ve61cOBPqoce9ED1D7ZRXh74I+ot7jpPju9umMM/cUMuyc/wbxTLvxmNxZoNjuRsmnS v1Lq9EjS3sfsZLlkQ4p0PdJ2fqchKSQC+U+yOjm1QF3cBh3+nxEpxfIEgo8N9PTxyPyu AzUQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=12WWtAjOpZVcjDSE0an3skBUcBMDZT6eSeMRGH+ViEw=; b=B1xaVs99T0DQxzC9d2e16nU8A9F54vqEZZ1/LqqM59Io9I5QVbDk5CbWU+W2fSat0e XKl0k4TnMA9k9wkcpWbaLgIh5/IT+remhESxKpgu2LgeoZNGUh6VPcI2XrK/rG2gfgrw hXIrrZeaKL4z8/XgabclTk7M/CLAoBiPgA8MebMM2E/EA+XXajmisGs3Kj5F3fuarC6Q l3AGIaLg+eioKR8HAgxSVPrLGFwLKoCrOR/2rReCR7SQ8b4MMIAzuCpf7msz8BbFwJb8 cz9QnsP6Mh1jJlaljfTLkWLo5B8oWlLWanfB3swHPdjFKWk7U4t+SfTM4mwhHwo6EuIm NNYQ== 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=alibaba.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f14si4454584otf.178.2020.01.15.19.32.09; Wed, 15 Jan 2020 19:32:21 -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=alibaba.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729151AbgAPD3E (ORCPT + 99 others); Wed, 15 Jan 2020 22:29:04 -0500 Received: from out30-43.freemail.mail.aliyun.com ([115.124.30.43]:53451 "EHLO out30-43.freemail.mail.aliyun.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726587AbgAPD3D (ORCPT ); Wed, 15 Jan 2020 22:29:03 -0500 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R121e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=e01f04452;MF=zhangliguang@linux.alibaba.com;NM=1;PH=DS;RN=3;SR=0;TI=SMTPD_---0TnrNuc._1579145331; Received: from localhost(mailfrom:zhangliguang@linux.alibaba.com fp:SMTPD_---0TnrNuc._1579145331) by smtp.aliyun-inc.com(127.0.0.1); Thu, 16 Jan 2020 11:29:00 +0800 From: luanshi To: james.morse@arm.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org Subject: [V2 1/3] firmware: arm_sdei: fix possible deadlock Date: Thu, 16 Jan 2020 11:28:49 +0800 Message-Id: <1579145331-78633-1-git-send-email-zhangliguang@linux.alibaba.com> X-Mailer: git-send-email 1.8.3.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We call sdei_reregister_event() with sdei_list_lock held but _sdei_event_register() and sdei_event_destroy() also acquires sdei_list_lock thus creating A-A deadlock. Fixes: da351827240e ("firmware: arm_sdei: Add support for CPU and system power states") Signed-off-by: Liguang Zhang --- drivers/firmware/arm_sdei.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c index a479023..37e9bf0 100644 --- a/drivers/firmware/arm_sdei.c +++ b/drivers/firmware/arm_sdei.c @@ -45,8 +45,11 @@ static asmlinkage void (*sdei_firmware_call)(unsigned long function_id, static unsigned long sdei_entry_point; struct sdei_event { - /* These three are protected by the sdei_list_lock */ + /* protected by the sdei_list_lock */ struct list_head list; + + spinlock_t sdei_event_lock; + /* These two are protected by the sdei_event_lock */ bool reregister; bool reenable; @@ -214,6 +217,7 @@ static struct sdei_event *sdei_event_create(u32 event_num, return ERR_PTR(-ENOMEM); INIT_LIST_HEAD(&event->list); + spin_lock_init(&event->sdei_event_lock); event->event_num = event_num; err = sdei_api_event_get_info(event_num, SDEI_EVENT_INFO_EV_PRIORITY, @@ -412,9 +416,9 @@ int sdei_event_enable(u32 event_num) return -ENOENT; } - spin_lock(&sdei_list_lock); + spin_lock(&event->sdei_event_lock); event->reenable = true; - spin_unlock(&sdei_list_lock); + spin_unlock(&event->sdei_event_lock); if (event->type == SDEI_EVENT_TYPE_SHARED) err = sdei_api_event_enable(event->event_num); @@ -491,10 +495,10 @@ static int _sdei_event_unregister(struct sdei_event *event) { lockdep_assert_held(&sdei_events_lock); - spin_lock(&sdei_list_lock); + spin_lock(&event->sdei_event_lock); event->reregister = false; event->reenable = false; - spin_unlock(&sdei_list_lock); + spin_unlock(&event->sdei_event_lock); if (event->type == SDEI_EVENT_TYPE_SHARED) return sdei_api_event_unregister(event->event_num); @@ -585,9 +589,9 @@ static int _sdei_event_register(struct sdei_event *event) lockdep_assert_held(&sdei_events_lock); - spin_lock(&sdei_list_lock); + spin_lock(&event->sdei_event_lock); event->reregister = true; - spin_unlock(&sdei_list_lock); + spin_unlock(&event->sdei_event_lock); if (event->type == SDEI_EVENT_TYPE_SHARED) return sdei_api_event_register(event->event_num, @@ -598,10 +602,10 @@ static int _sdei_event_register(struct sdei_event *event) err = sdei_do_cross_call(_local_event_register, event); if (err) { - spin_lock(&sdei_list_lock); + spin_lock(&event->sdei_event_lock); event->reregister = false; event->reenable = false; - spin_unlock(&sdei_list_lock); + spin_unlock(&event->sdei_event_lock); sdei_do_cross_call(_local_event_unregister, event); } -- 1.8.3.1