From patchwork Wed Jun 26 16:26:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 167839 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp1158065ilk; Wed, 26 Jun 2019 09:28:36 -0700 (PDT) X-Google-Smtp-Source: APXvYqzeBJyrOnPlphl7pNV3rd+jw9RP7+gH0zc17EKQCsDDmS1TY/icEvIan8rh4I+VwZSiHKUk X-Received: by 2002:a17:90a:d14b:: with SMTP id t11mr1032664pjw.79.1561566515937; Wed, 26 Jun 2019 09:28:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561566515; cv=none; d=google.com; s=arc-20160816; b=iwks5CcQAy/Pq21AYY09SGIOFr2Dav0EjXwk19VidwRDU78pfluCFm37YBClTqSORk nZi1shs3SEEOUxo9xOYhE0NPvshDK3cqnGdz1uP9hm1r5lp2s+xZFblAU+JB6GtAkSyj xdMspZIsCZlc3S6NvzISz/SsOkp99fkntTE5iSCtfyaDrGA1tRPtkCgrenzrsvzLYMe9 U/zVzlamsyMAVdIeJXb72h5B+PDI9UYIGDGBA2Oia5rMYmDLpeLi6OwoQf1xELU/F85p tBgp/w27ME4QvCqsiVUdd66mN5XvXszJKgxGBpW0P1qWg+U0DwGlmtn4K6K3ztzEIwsU fDJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=OpJU7uJo3GX7afAAcEYz3oDNKK2QelsMLaehetq1p+o=; b=rWzBa4Fx1ZD6r8+lLAPOexMgxQ7HptGl/9M7NY56/w2PL8SxbGxT+/Kr0cPEc+ZVZ8 yKVTt91nV+ct3s0NBelLgsUQhyAiNp0YbEd+EfLYTfzq/ku0VrP2H64ATEPcW1ZgGeCi vTHb+LPRSpvjf72bLFI+0LOogvXeryDCiAw3SS0npgP07ycUPkSCDNsQ04VNr06m2W3L nzc9W1RNZC5Tcxr/mAvpq3IPWedtQXoCO0H98MaZuNxBtt8l5Y8fN1CdKoVFmDzOkc40 fU7NnO6k+XDm2Wjozj538HZ2k1kLw3C49XyDQxJVCnB4bXSaOh2OBMMl4zJ/Z4zmgjhU ZTnQ== 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 bc8si3558738plb.322.2019.06.26.09.28.35; Wed, 26 Jun 2019 09:28:35 -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 S1726523AbfFZQ2e (ORCPT + 30 others); Wed, 26 Jun 2019 12:28:34 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:19085 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726014AbfFZQ2d (ORCPT ); Wed, 26 Jun 2019 12:28:33 -0400 Received: from DGGEMS405-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 5BE6637B57A44D2D3B5C; Thu, 27 Jun 2019 00:28:31 +0800 (CST) Received: from localhost.localdomain (10.67.212.75) by DGGEMS405-HUB.china.huawei.com (10.3.19.205) with Microsoft SMTP Server id 14.3.439.0; Thu, 27 Jun 2019 00:28:25 +0800 From: John Garry To: CC: , , , , , John Garry Subject: [PATCH v3 1/6] lib: logic_pio: Fix RCU usage Date: Thu, 27 Jun 2019 00:26:53 +0800 Message-ID: <1561566418-22714-2-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1561566418-22714-1-git-send-email-john.garry@huawei.com> References: <1561566418-22714-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.212.75] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The traversing of io_range_list with list_for_each_entry_rcu() is not properly protected by rcu_read_lock() and rcu_read_unlock(), so add them. These functions mark the critical section scope where the list is protected for the reader, it cannot be "reclaimed". Any updater - in this case, the logical PIO registration functions - cannot update the list until the reader exits this critical section. In addition, the list traversing used in logic_pio_register_range() does not need to use the rcu variant. This is because we are already using io_range_mutex to guarantee mutual exclusion from mutating the list. Fixes: 031e3601869c ("lib: Add generic PIO mapping method") Signed-off-by: John Garry --- lib/logic_pio.c | 49 +++++++++++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 14 deletions(-) -- 2.17.1 diff --git a/lib/logic_pio.c b/lib/logic_pio.c index feea48fd1a0d..761296376fbc 100644 --- a/lib/logic_pio.c +++ b/lib/logic_pio.c @@ -46,7 +46,7 @@ int logic_pio_register_range(struct logic_pio_hwaddr *new_range) end = new_range->hw_start + new_range->size; mutex_lock(&io_range_mutex); - list_for_each_entry_rcu(range, &io_range_list, list) { + list_for_each_entry(range, &io_range_list, list) { if (range->fwnode == new_range->fwnode) { /* range already there */ goto end_register; @@ -108,26 +108,38 @@ int logic_pio_register_range(struct logic_pio_hwaddr *new_range) */ struct logic_pio_hwaddr *find_io_range_by_fwnode(struct fwnode_handle *fwnode) { - struct logic_pio_hwaddr *range; + struct logic_pio_hwaddr *range, *found_range = NULL; + rcu_read_lock(); list_for_each_entry_rcu(range, &io_range_list, list) { - if (range->fwnode == fwnode) - return range; + if (range->fwnode == fwnode) { + found_range = range; + break; + } } - return NULL; + rcu_read_unlock(); + + return found_range; } /* Return a registered range given an input PIO token */ static struct logic_pio_hwaddr *find_io_range(unsigned long pio) { - struct logic_pio_hwaddr *range; + struct logic_pio_hwaddr *range, *found_range = NULL; + rcu_read_lock(); list_for_each_entry_rcu(range, &io_range_list, list) { - if (in_range(pio, range->io_start, range->size)) - return range; + if (in_range(pio, range->io_start, range->size)) { + found_range = range; + break; + } } - pr_err("PIO entry token %lx invalid\n", pio); - return NULL; + rcu_read_unlock(); + + if (!found_range) + pr_err("PIO entry token 0x%lx invalid\n", pio); + + return found_range; } /** @@ -180,14 +192,23 @@ unsigned long logic_pio_trans_cpuaddr(resource_size_t addr) { struct logic_pio_hwaddr *range; + rcu_read_lock(); list_for_each_entry_rcu(range, &io_range_list, list) { if (range->flags != LOGIC_PIO_CPU_MMIO) continue; - if (in_range(addr, range->hw_start, range->size)) - return addr - range->hw_start + range->io_start; + if (in_range(addr, range->hw_start, range->size)) { + unsigned long cpuaddr; + + cpuaddr = addr - range->hw_start + range->io_start; + + rcu_read_unlock(); + return cpuaddr; + } } - pr_err("addr %llx not registered in io_range_list\n", - (unsigned long long) addr); + rcu_read_unlock(); + + pr_err("addr %pa not registered in io_range_list\n", &addr); + return ~0UL; } From patchwork Wed Jun 26 16:26:54 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 167840 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp1158213ilk; Wed, 26 Jun 2019 09:28:43 -0700 (PDT) X-Google-Smtp-Source: APXvYqwOhtjr2qAlstbV/So+LpT3Uoc8AVzwy3WpXOOOVg4HSUoXwJGraVqWP6Zu9UeCLiDHeA5D X-Received: by 2002:a17:902:2a69:: with SMTP id i96mr6449499plb.108.1561566523213; Wed, 26 Jun 2019 09:28:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561566523; cv=none; d=google.com; s=arc-20160816; b=MjXZCwe2UVN3Hw2J/UBZsZWuoSEKwIaltbW0AJZ+RllERMPzp+8TAqxKirxSnn4SfX Jdrl9pCkHhUHTBFmqBu1YJLlDMvMuKjEyMrbVPHMR/j4lqiu1SXp5jcADoTwn4qb8ZSS lAPtp6QL2Qp7oV/pPxOtzPdvZSaudAbYYlsvsYxjXPdbvWIFW5Zvf+mHSAttryKjUBjH EvDbZUcvj7MtZ4u1wRJgUqQLsWegHFpM6Ev8ECuyr3ITK7IUp9UGpyKMUTN/26zUYI9S C0suHzACoSOWSx/jee4VYXDNt69LqMIWXqyXrxgguIakK2s8IzNzLSctz0FMnG+mAZsy bFgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=YbMsKQOGvNVmnCkG055vw5MTKwlUSB2A0oBLuO3pDog=; b=YMBTxzY8EMgbUWta+VfuzlgSdAGZwC8Zl2YL4QnL9t6GSMT7dk8xmfokYtO+7tW0fF eXDwyftjRxe/cQRgfhigPSnPZdtSatjAzhyvx2T4kGYZpuiAl/5lo4wQtQurPSSveGDx yccYrGSNbKp1/LxQpDS9lX6n8drJJQyl8UrwsDSLt2SEYJFvFh/fJ1ZMi79opU2OFxZu /eGsrIv7JldAjS8HuMfoSHApmeWc9OmAWsUJQ2PBUdSHndNpAUUzWRVcT00AY/bdWvzc JTeufOruOuNtGMLWljFTlGVaK9deTzCW6f3ucy9E90l2xj2DUSnaQkJkJ+7CIdlp41L6 nFJw== 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 m12si6676329pgn.149.2019.06.26.09.28.42; Wed, 26 Jun 2019 09:28:43 -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 S1726633AbfFZQ2l (ORCPT + 30 others); Wed, 26 Jun 2019 12:28:41 -0400 Received: from szxga06-in.huawei.com ([45.249.212.32]:50168 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726042AbfFZQ2j (ORCPT ); Wed, 26 Jun 2019 12:28:39 -0400 Received: from DGGEMS405-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 2A0A9EADBB0639188F3A; Thu, 27 Jun 2019 00:28:31 +0800 (CST) Received: from localhost.localdomain (10.67.212.75) by DGGEMS405-HUB.china.huawei.com (10.3.19.205) with Microsoft SMTP Server id 14.3.439.0; Thu, 27 Jun 2019 00:28:25 +0800 From: John Garry To: CC: , , , , , John Garry Subject: [PATCH v3 2/6] lib: logic_pio: Avoid possible overlap for unregistering regions Date: Thu, 27 Jun 2019 00:26:54 +0800 Message-ID: <1561566418-22714-3-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1561566418-22714-1-git-send-email-john.garry@huawei.com> References: <1561566418-22714-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.212.75] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The code was originally written to not support unregistering logical PIO regions. To accommodate supporting unregistering logical PIO regions, subtly modify LOGIC_PIO_CPU_MMIO region registration code, such that the "end" of the registered regions is the "end" of the last region, and not the sum of the sizes of all the registered regions. Signed-off-by: John Garry --- lib/logic_pio.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) -- 2.17.1 diff --git a/lib/logic_pio.c b/lib/logic_pio.c index 761296376fbc..d0165c88f705 100644 --- a/lib/logic_pio.c +++ b/lib/logic_pio.c @@ -35,7 +35,7 @@ int logic_pio_register_range(struct logic_pio_hwaddr *new_range) struct logic_pio_hwaddr *range; resource_size_t start; resource_size_t end; - resource_size_t mmio_sz = 0; + resource_size_t mmio_end = 0; resource_size_t iio_sz = MMIO_UPPER_LIMIT; int ret = 0; @@ -56,7 +56,7 @@ int logic_pio_register_range(struct logic_pio_hwaddr *new_range) /* for MMIO ranges we need to check for overlap */ if (start >= range->hw_start + range->size || end < range->hw_start) { - mmio_sz += range->size; + mmio_end = range->io_start + range->size; } else { ret = -EFAULT; goto end_register; @@ -69,16 +69,16 @@ int logic_pio_register_range(struct logic_pio_hwaddr *new_range) /* range not registered yet, check for available space */ if (new_range->flags == LOGIC_PIO_CPU_MMIO) { - if (mmio_sz + new_range->size - 1 > MMIO_UPPER_LIMIT) { + if (mmio_end + new_range->size - 1 > MMIO_UPPER_LIMIT) { /* if it's too big check if 64K space can be reserved */ - if (mmio_sz + SZ_64K - 1 > MMIO_UPPER_LIMIT) { + if (mmio_end + SZ_64K - 1 > MMIO_UPPER_LIMIT) { ret = -E2BIG; goto end_register; } new_range->size = SZ_64K; pr_warn("Requested IO range too big, new size set to 64K\n"); } - new_range->io_start = mmio_sz; + new_range->io_start = mmio_end; } else if (new_range->flags == LOGIC_PIO_INDIRECT) { if (iio_sz + new_range->size - 1 > IO_SPACE_LIMIT) { ret = -E2BIG; From patchwork Wed Jun 26 16:26:55 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 167841 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp1158296ilk; Wed, 26 Jun 2019 09:28:47 -0700 (PDT) X-Google-Smtp-Source: APXvYqzAHa1x47QI5GSE0wYZUz6wKQTOkHghbz64P7bEmcRaMEarlQ9SeDfi66YOQ2i3kGeVa4LS X-Received: by 2002:a17:90a:5887:: with SMTP id j7mr5707432pji.136.1561566527544; Wed, 26 Jun 2019 09:28:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561566527; cv=none; d=google.com; s=arc-20160816; b=g6F/2DemtBJWYPuGThASCG0ORRLbmaw/qImMCrzciEoOPY25GZgRm6Li7qiXMfg4fH rriVRLeOupSdD3Slpdj9M5ksNbesqgWOWFHVuKDiCg3UEFev1m255I09WPCIy+6ps0QE oS6Rorfd+2EtQIBeOB7C95pynNMvq6leYSWftZgqfuUfJ9ppOVhaKgcVxOzFIDwWA414 Xwnn7KwFnfdNpUrRjP52X0yIPb2+aBRI8vsKPSdsy5dJK2Bq/rscvm97EmTB7vbCCZCK lTUivtxxx7p0kpMDDjWUTEuMa/YynKMKhMDV3uO9ViKQuz4nKv86AkOb3+orS7dGtO4o c2ZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=ZrEG8o34TAZKcyMewnNA9kGmfUhEFU6mWpLliqmz2lI=; b=pfX1JXSIVKm7MEagyaJU53y9OVLYVqWDKGZxE4Hw6tjAaX9m/urRu4360cLvivIccH xBsnvpjwTrlyYYNSyZyhGsBPtuqKT1OGgVhVLXyu2Z49ajvZC9OGLnyUYaJGHY8lLQC5 gGW3LlmywdwOquhonVuGxThAOIZ/EddCO85APfiYvFyA3J9nGdpijt8uoeSKnEE91HJZ Fdjs28ddcr++2wue0qxYigvwtWCExSKUILcCVeORiw8ATB+lKR7NcDVMIAj6cRvm8qYv H/do/sQA53zhtM/+S3SkYntP+NWhtUO0u6MebZqcPIdpl7zQKlbSkk+rGJm8bMbRK14F Ss4Q== 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 i101si2256177pje.4.2019.06.26.09.28.47; Wed, 26 Jun 2019 09:28:47 -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 S1726667AbfFZQ2p (ORCPT + 30 others); Wed, 26 Jun 2019 12:28:45 -0400 Received: from szxga06-in.huawei.com ([45.249.212.32]:50332 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726632AbfFZQ2l (ORCPT ); Wed, 26 Jun 2019 12:28:41 -0400 Received: from DGGEMS405-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id 430CA3F3D441F8870052; Thu, 27 Jun 2019 00:28:36 +0800 (CST) Received: from localhost.localdomain (10.67.212.75) by DGGEMS405-HUB.china.huawei.com (10.3.19.205) with Microsoft SMTP Server id 14.3.439.0; Thu, 27 Jun 2019 00:28:25 +0800 From: John Garry To: CC: , , , , , John Garry Subject: [PATCH v3 3/6] lib: logic_pio: Add logic_pio_unregister_range() Date: Thu, 27 Jun 2019 00:26:55 +0800 Message-ID: <1561566418-22714-4-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1561566418-22714-1-git-send-email-john.garry@huawei.com> References: <1561566418-22714-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.212.75] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add a function to unregister a logical PIO range. Logical PIO space can still be leaked when unregistering certain LOGIC_PIO_CPU_MMIO regions, but this acceptable for now since there are no callers to unregister LOGIC_PIO_CPU_MMIO regions, and the logical PIO region allocation scheme would need significant work to improve this. Signed-off-by: John Garry --- include/linux/logic_pio.h | 1 + lib/logic_pio.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) -- 2.17.1 diff --git a/include/linux/logic_pio.h b/include/linux/logic_pio.h index cbd9d8495690..88e1e6304a71 100644 --- a/include/linux/logic_pio.h +++ b/include/linux/logic_pio.h @@ -117,6 +117,7 @@ struct logic_pio_hwaddr *find_io_range_by_fwnode(struct fwnode_handle *fwnode); unsigned long logic_pio_trans_hwaddr(struct fwnode_handle *fwnode, resource_size_t hw_addr, resource_size_t size); int logic_pio_register_range(struct logic_pio_hwaddr *newrange); +void logic_pio_unregister_range(struct logic_pio_hwaddr *range); resource_size_t logic_pio_to_hwaddr(unsigned long pio); unsigned long logic_pio_trans_cpuaddr(resource_size_t hw_addr); diff --git a/lib/logic_pio.c b/lib/logic_pio.c index d0165c88f705..905027574e5d 100644 --- a/lib/logic_pio.c +++ b/lib/logic_pio.c @@ -98,6 +98,20 @@ int logic_pio_register_range(struct logic_pio_hwaddr *new_range) return ret; } +/** + * logic_pio_unregister_range - unregister a logical PIO range for a host + * @range: pointer to the IO range which has been already registered. + * + * Unregister a previously-registered IO range node. + */ +void logic_pio_unregister_range(struct logic_pio_hwaddr *range) +{ + mutex_lock(&io_range_mutex); + list_del_rcu(&range->list); + mutex_unlock(&io_range_mutex); + synchronize_rcu(); +} + /** * find_io_range_by_fwnode - find logical PIO range for given FW node * @fwnode: FW node handle associated with logical PIO range From patchwork Wed Jun 26 16:26:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 167843 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp1158429ilk; Wed, 26 Jun 2019 09:28:54 -0700 (PDT) X-Google-Smtp-Source: APXvYqyu2QUjSdSVbkIxN71doJdPMbe7Jq/MadHwtbwn+/pWJ701i+SiPqCvMbC4JY2kJyu8B+MM X-Received: by 2002:a17:90a:9f0b:: with SMTP id n11mr5636916pjp.98.1561566534113; Wed, 26 Jun 2019 09:28:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561566534; cv=none; d=google.com; s=arc-20160816; b=NYZoOJqa81fXwq7M6GTFAu/NwDCCSqU4oaS6HQQOUwOp3J88b5Gyt/YhxnYLYANWVd PJpJ1XIkwIl7iRr+IEYQ7C5dGF3JiUgnRaUGCMLulEndh1zTrs5InJz5jhyBjELRiH55 Y8sEN8RSBOi6fYk8T7k6grAtt9cYF7VbpHG7WS50UQpatmg7ui9LiNLJLoFTcFm8WWgK PBmaC5iYWvXMmlIMWf8z//9AiMSA1liOYh+eO5lXSSrieNm2bqB8M0nGmWXeeqJkByNQ G0nYTMK9PU9HNQwDDpeAaCLLz1j9QdJnN5IlgEz9fk5ZbMZsLs8IUwJoApfeChwiq+qi ymuA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=vpQoSP2Vi2lg1x36aE5SBgCgPKw2EpZdNMWXXKdNWko=; b=iVWskTzdF1c6v5fNCbjR7NLtQhMlkFzMQdWAS5Ndv4C4UjfNvbuX+Sh4znHYxuwiuy YAVEgkBaaZHhwXomPGhzH/lhDaREeyf+9AhqCTjQwmYmQKumkvCEIQEcXhPrdMZoBpE0 XECQxYZUWY7FNDij+A5qjgsTZyXK4jIEVOIkltyIzE1lejItkCiWSDhhzmMNLbDCc+iJ GftgxDb9kQ6oXEW3l9OkIsj/0uvIwipUc6YuqdlI0W3eysivX+eXl1qHG0R2MYxYNynb cBQkGJHGX8Q1zfmrW4+hxL6zj/nkBkSVnrMf433tCz4bAa5HFX7vz0aBeHTnQiwIvQ9i fJAg== 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 i101si2256177pje.4.2019.06.26.09.28.53; Wed, 26 Jun 2019 09:28: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; 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 S1726682AbfFZQ2w (ORCPT + 30 others); Wed, 26 Jun 2019 12:28:52 -0400 Received: from szxga06-in.huawei.com ([45.249.212.32]:50382 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726042AbfFZQ2n (ORCPT ); Wed, 26 Jun 2019 12:28:43 -0400 Received: from DGGEMS405-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id 6CE17EF3578678A11DCB; Thu, 27 Jun 2019 00:28:36 +0800 (CST) Received: from localhost.localdomain (10.67.212.75) by DGGEMS405-HUB.china.huawei.com (10.3.19.205) with Microsoft SMTP Server id 14.3.439.0; Thu, 27 Jun 2019 00:28:25 +0800 From: John Garry To: CC: , , , , , John Garry Subject: [PATCH v3 4/6] bus: hisi_lpc: Unregister logical PIO range to avoid potential use-after-free Date: Thu, 27 Jun 2019 00:26:56 +0800 Message-ID: <1561566418-22714-5-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1561566418-22714-1-git-send-email-john.garry@huawei.com> References: <1561566418-22714-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.212.75] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If, after registering a logical PIO range, the driver probe later fails, the logical PIO range memory will be released automatically. This causes an issue, in that the logical PIO range is not unregistered and the released range memory may be later referenced. Fix by unregistering the logical PIO range. And since we now unregister the logical PIO range for probe failure, avoid the special ordering of setting logical PIO range ops, which was the previous (poor) attempt at a safeguard against this. Fixes: adf38bb0b595 ("HISI LPC: Support the LPC host on Hip06/Hip07 with DT bindings") Signed-off-by: John Garry --- drivers/bus/hisi_lpc.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) -- 2.17.1 diff --git a/drivers/bus/hisi_lpc.c b/drivers/bus/hisi_lpc.c index 19d7b6ff2f17..6d301aafcad2 100644 --- a/drivers/bus/hisi_lpc.c +++ b/drivers/bus/hisi_lpc.c @@ -606,24 +606,25 @@ static int hisi_lpc_probe(struct platform_device *pdev) range->fwnode = dev->fwnode; range->flags = LOGIC_PIO_INDIRECT; range->size = PIO_INDIRECT_SIZE; + range->hostdata = lpcdev; + range->ops = &hisi_lpc_ops; + lpcdev->io_host = range; ret = logic_pio_register_range(range); if (ret) { dev_err(dev, "register IO range failed (%d)!\n", ret); return ret; } - lpcdev->io_host = range; /* register the LPC host PIO resources */ if (acpi_device) ret = hisi_lpc_acpi_probe(dev); else ret = of_platform_populate(dev->of_node, NULL, NULL, dev); - if (ret) + if (ret) { + logic_pio_unregister_range(range); return ret; - - lpcdev->io_host->hostdata = lpcdev; - lpcdev->io_host->ops = &hisi_lpc_ops; + } io_end = lpcdev->io_host->io_start + lpcdev->io_host->size; dev_info(dev, "registered range [%pa - %pa]\n", From patchwork Wed Jun 26 16:26:57 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 167844 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp1158503ilk; Wed, 26 Jun 2019 09:28:58 -0700 (PDT) X-Google-Smtp-Source: APXvYqwaXFRLLDhW10ehmi+qbHTWrOdaf9rhz30zlxBYnnvPNVUIk3gl9138RHzgOXhDiSoXSW/I X-Received: by 2002:a17:90a:80c4:: with SMTP id k4mr5848845pjw.74.1561566538601; Wed, 26 Jun 2019 09:28:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561566538; cv=none; d=google.com; s=arc-20160816; b=FOivIxZi55mqTcl4BKhG5VOcw+/HtE2bjWRcNV6t/5fMwN4/fofhtrlAdZkK9QNYtM 1rxWLb2VXN05aJlVhriqq9oAm1bfesOLhMvDDsRrJoCFs0TdkPAYoLdPsSR/nZVLnASA Cl7xCRFrhWoHDkZ5/K5LUOVLh81zDTh6OmDxfLDWiSAtaZFG0ckcHQ4B2m+GlWboaLXs Y1aoDHB916+3sEe3kBdr6ozPITX6dtNoQE0vi7zOK8mfstbuK4Rq5aqLcRvu5+E720/+ kSuYpznyvf/m2Fk2Apdn6xxqcJncxEydrMVNU3VpH4k2udh1mv5WaVJLZVK2eHP5HJmk wPPQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=Q+OUXd9UX5Y8ny3J3aMi58yk6HOBDtpr07mvrruaCf0=; b=MZysPlSgmf+gx0q3yEQHzvLpti0KzF1DgzXZnzqazX5opsLtMyoiFr+FfChKd4dZRd fGHH2uw8mFZZWLFQTaBDPCh3+VAxYoFwuVl+3Vzba4dWHKJtpRoTYb44/KBqaWvbbJSl T6RIKdPDHY/OZ6HDRuAPByRiDq454QRFH0YrhWVndBDznaLvWzTJAbXDqVQ9xWGi85DT nc9mGLkKpAZjag4Qyc/GjtQ+kk/j8eeHr9lSUxX1rFw3z1uTtAPH0sqNCkrexpRfZxdp tajOKt4CTm/Acdvsc2oFpYJAl9AahIdGlGa5xDtbDpcM0clL80TmJFcS42C5k0JYjYzp kWkg== 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 i101si2256177pje.4.2019.06.26.09.28.58; Wed, 26 Jun 2019 09:28:58 -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 S1726718AbfFZQ24 (ORCPT + 30 others); Wed, 26 Jun 2019 12:28:56 -0400 Received: from szxga06-in.huawei.com ([45.249.212.32]:50326 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726596AbfFZQ2k (ORCPT ); Wed, 26 Jun 2019 12:28:40 -0400 Received: from DGGEMS405-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id 39522FF1DB3AA2EC3A71; Thu, 27 Jun 2019 00:28:36 +0800 (CST) Received: from localhost.localdomain (10.67.212.75) by DGGEMS405-HUB.china.huawei.com (10.3.19.205) with Microsoft SMTP Server id 14.3.439.0; Thu, 27 Jun 2019 00:28:26 +0800 From: John Garry To: CC: , , , , , John Garry Subject: [PATCH v3 5/6] bus: hisi_lpc: Add .remove method to avoid driver unbind crash Date: Thu, 27 Jun 2019 00:26:57 +0800 Message-ID: <1561566418-22714-6-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1561566418-22714-1-git-send-email-john.garry@huawei.com> References: <1561566418-22714-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.212.75] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The original driver author seemed to be under the impression that a driver cannot be removed if it does not have a .remove method. Or maybe if it is a built-in platform driver. This is not true. This crash can be created: root@ubuntu:/sys/bus/platform/drivers/hisi-lpc# echo HISI0191\:00 > unbind root@ubuntu:/sys/bus/platform/drivers/hisi-lpc# ipmitool raw 6 1 Unable to handle kernel paging request at virtual address ffff000010035010 Mem abort info: ESR = 0x96000047 Exception class = DABT (current EL), IL = 32 bits SET = 0, FnV = 0 EA = 0, S1PTW = 0 Data abort info: ISV = 0, ISS = 0x00000047 CM = 0, WnR = 1 swapper pgtable: 4k pages, 48-bit VAs, pgdp=000000000118b000 [ffff000010035010] pgd=0000041ffbfff003, pud=0000041ffbffe003, pmd=0000041ffbffd003, pte=0000000000000000 Internal error: Oops: 96000047 [#1] PREEMPT SMP Modules linked in: CPU: 17 PID: 1473 Comm: ipmitool Not tainted 5.2.0-rc5-00003-gf68c53b414a3-dirty #198 Hardware name: Huawei Taishan 2280 /D05, BIOS Hisilicon D05 IT21 Nemo 2.0 RC0 04/18/2018 pstate: 20000085 (nzCv daIf -PAN -UAO) pc : hisi_lpc_target_in+0x7c/0x120 lr : hisi_lpc_target_in+0x70/0x120 sp : ffff00001efe3930 x29: ffff00001efe3930 x28: ffff841f9f599200 x27: 0000000000000002 x26: 0000000000000000 x25: 0000000000000080 x24: 00000000000000e4 x23: 0000000000000000 x22: 0000000000000064 x21: ffff801fb667d280 x20: 0000000000000001 x19: ffff00001efe39ac x18: 0000000000000000 x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000000 x14: 0000000000000000 x13: 0000000000000000 x12: 0000000000000000 x11: 0000000000000000 x10: 0000000000000000 x9 : 0000000000000000 x8 : ffff841febe60340 x7 : ffff801fb55c52e8 x6 : 0000000000000000 x5 : 0000000000ffc0e3 x4 : 0000000000000001 x3 : ffff801fb667d280 x2 : 0000000000000001 x1 : ffff000010035010 x0 : ffff000010035000 Call trace: hisi_lpc_target_in+0x7c/0x120 hisi_lpc_comm_in+0x88/0x98 logic_inb+0x5c/0xb8 port_inb+0x18/0x20 bt_event+0x38/0x808 smi_event_handler+0x4c/0x5a0 check_start_timer_thread.part.4+0x40/0x58 sender+0x78/0x88 smi_send.isra.6+0x94/0x108 i_ipmi_request+0x2c4/0x8f8 ipmi_request_settime+0x124/0x160 handle_send_req+0x19c/0x208 ipmi_ioctl+0x2c0/0x990 do_vfs_ioctl+0xb8/0x8f8 ksys_ioctl+0x80/0xb8 __arm64_sys_ioctl+0x1c/0x28 el0_svc_common.constprop.0+0x64/0x160 el0_svc_handler+0x28/0x78 el0_svc+0x8/0xc Code: 941d1511 aa0003f9 f94006a0 91004001 (b9000034) ---[ end trace aa842b86af7069e4 ]--- The problem here is that the host goes away but the associated logical PIO region remains registered, as do the children devices. Fix by adding a .remove method to tidy-up by removing the child devices and unregistering the logical PIO region. Fixes: adf38bb0b595 ("HISI LPC: Support the LPC host on Hip06/Hip07 with DT bindings") Signed-off-by: John Garry --- drivers/bus/hisi_lpc.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) -- 2.17.1 diff --git a/drivers/bus/hisi_lpc.c b/drivers/bus/hisi_lpc.c index 6d301aafcad2..20c957185af2 100644 --- a/drivers/bus/hisi_lpc.c +++ b/drivers/bus/hisi_lpc.c @@ -456,6 +456,17 @@ struct hisi_lpc_acpi_cell { size_t pdata_size; }; +static void hisi_lpc_acpi_remove(struct device *hostdev) +{ + struct acpi_device *adev = ACPI_COMPANION(hostdev); + struct acpi_device *child; + + device_for_each_child(hostdev, NULL, hisi_lpc_acpi_remove_subdev); + + list_for_each_entry(child, &adev->children, node) + acpi_device_clear_enumerated(child); +} + /* * hisi_lpc_acpi_probe - probe children for ACPI FW * @hostdev: LPC host device pointer @@ -555,8 +566,7 @@ static int hisi_lpc_acpi_probe(struct device *hostdev) return 0; fail: - device_for_each_child(hostdev, NULL, - hisi_lpc_acpi_remove_subdev); + hisi_lpc_acpi_remove(hostdev); return ret; } @@ -569,6 +579,10 @@ static int hisi_lpc_acpi_probe(struct device *dev) { return -ENODEV; } + +static void hisi_lpc_acpi_remove(struct device *hostdev) +{ +} #endif // CONFIG_ACPI /* @@ -626,6 +640,8 @@ static int hisi_lpc_probe(struct platform_device *pdev) return ret; } + dev_set_drvdata(dev, lpcdev); + io_end = lpcdev->io_host->io_start + lpcdev->io_host->size; dev_info(dev, "registered range [%pa - %pa]\n", &lpcdev->io_host->io_start, &io_end); @@ -633,6 +649,23 @@ static int hisi_lpc_probe(struct platform_device *pdev) return ret; } +static int hisi_lpc_remove(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct acpi_device *acpi_device = ACPI_COMPANION(dev); + struct hisi_lpc_dev *lpcdev = dev_get_drvdata(dev); + struct logic_pio_hwaddr *range = lpcdev->io_host; + + if (acpi_device) + hisi_lpc_acpi_remove(dev); + else + of_platform_depopulate(dev); + + logic_pio_unregister_range(range); + + return 0; +} + static const struct of_device_id hisi_lpc_of_match[] = { { .compatible = "hisilicon,hip06-lpc", }, { .compatible = "hisilicon,hip07-lpc", }, @@ -646,5 +679,6 @@ static struct platform_driver hisi_lpc_driver = { .acpi_match_table = ACPI_PTR(hisi_lpc_acpi_match), }, .probe = hisi_lpc_probe, + .remove = hisi_lpc_remove, }; builtin_platform_driver(hisi_lpc_driver); From patchwork Wed Jun 26 16:26:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Garry X-Patchwork-Id: 167845 Delivered-To: patch@linaro.org Received: by 2002:a92:4782:0:0:0:0:0 with SMTP id e2csp1158533ilk; Wed, 26 Jun 2019 09:29:00 -0700 (PDT) X-Google-Smtp-Source: APXvYqwUQTJ0QqJQqi/PWVk7KkxkbPiRrnhtSNCXpES3VgsC1McB5iGEDxZclaZiNT2zL9tg+ZmM X-Received: by 2002:a17:902:e281:: with SMTP id cf1mr6225263plb.271.1561566540405; Wed, 26 Jun 2019 09:29:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1561566540; cv=none; d=google.com; s=arc-20160816; b=PqWAJ4Uri4RLdwtx56apqsM7TE8i6icY1ie6pDyfAJBfXtxTmIRbcCyo+bAmMWu2Id j46beRuYFhNaBtC2zm6lDQX16aL/5kvwNuumhuN60Bho5VuCUiDV0cGyTpERDmz7/wEP k+Z4p81ggx4UUVfiLqj2OwN0azZqQbjjW/CSrZFS4eYa2rMSj8J+lOHHL1rgbiVCdsCf 8aYhtSaYhrWcMaoAVnMOtaxfdtB4GOSMcOPOohoXS2NR6pd3zX3QPsT+OdtxE0IFJYgK 4PK+m5Hfu7t5pBwy0Ein5fHaXa1VEpNCEfnTCxgzOR2ItyIEqyDrvAnqA6L+WReSK6qJ UHaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=c5Qb7+GCUQbMBVYb30khBcTVFmxUrPGSa5utdoQ5VA4=; b=JhPBzqAZugKTzkhhq9kWYY7ilONsDLa11JwppILOgfcYL7DzQlXgL2H5D4APNH0kpz tfNleftcSDyzYPPiV4RVwGFynHiUIw7fHwvhp3QBNynd26pXCrY5py/YCai5Sxw+0ujf chtKYvcpgLzL1YWtlbO7NCIyz2oGj/dzzBPSCn3jclgCh1PJJMRIhD8smUP9/TVnqmuG KSNOSp+zBgjb6Chds5WVMjWu5Xpn6FToHeVjQLScsIQfwI3FcaoQ1yXEBPa+w+XHKTK8 aQs8d7fb8wuMubrf/7S+Lfz5/Nftnk7LOH7emnGfCeVAf5xaQrI2q62/Jmx9cRgCx19S A/TA== 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 i101si2256177pje.4.2019.06.26.09.29.00; Wed, 26 Jun 2019 09:29:00 -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 S1726695AbfFZQ2z (ORCPT + 30 others); Wed, 26 Jun 2019 12:28:55 -0400 Received: from szxga06-in.huawei.com ([45.249.212.32]:50324 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726601AbfFZQ2j (ORCPT ); Wed, 26 Jun 2019 12:28:39 -0400 Received: from DGGEMS405-HUB.china.huawei.com (unknown [172.30.72.58]) by Forcepoint Email with ESMTP id 3EB0DFA71DF6CE458D6D; Thu, 27 Jun 2019 00:28:36 +0800 (CST) Received: from localhost.localdomain (10.67.212.75) by DGGEMS405-HUB.china.huawei.com (10.3.19.205) with Microsoft SMTP Server id 14.3.439.0; Thu, 27 Jun 2019 00:28:26 +0800 From: John Garry To: CC: , , , , , John Garry Subject: [PATCH v3 6/6] lib: logic_pio: Enforce LOGIC_PIO_INDIRECT region ops are set at registration Date: Thu, 27 Jun 2019 00:26:58 +0800 Message-ID: <1561566418-22714-7-git-send-email-john.garry@huawei.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1561566418-22714-1-git-send-email-john.garry@huawei.com> References: <1561566418-22714-1-git-send-email-john.garry@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.67.212.75] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Since the only LOGIC_PIO_INDIRECT host (hisi-lpc) now sets the ops prior to registration, enforce this check at registration instead of in the IO port accessors to simplify and marginally optimise the code. A slight misalignment is also tidied. Suggested-by: Bjorn Helgaas Signed-off-by: John Garry --- lib/logic_pio.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) -- 2.17.1 diff --git a/lib/logic_pio.c b/lib/logic_pio.c index 905027574e5d..52831a85293a 100644 --- a/lib/logic_pio.c +++ b/lib/logic_pio.c @@ -39,7 +39,8 @@ int logic_pio_register_range(struct logic_pio_hwaddr *new_range) resource_size_t iio_sz = MMIO_UPPER_LIMIT; int ret = 0; - if (!new_range || !new_range->fwnode || !new_range->size) + if (!new_range || !new_range->fwnode || !new_range->size || + (new_range->flags == LOGIC_PIO_INDIRECT && !new_range->ops)) return -EINVAL; start = new_range->hw_start; @@ -237,7 +238,7 @@ type logic_in##bw(unsigned long addr) \ } else if (addr >= MMIO_UPPER_LIMIT && addr < IO_SPACE_LIMIT) { \ struct logic_pio_hwaddr *entry = find_io_range(addr); \ \ - if (entry && entry->ops) \ + if (entry) \ ret = entry->ops->in(entry->hostdata, \ addr, sizeof(type)); \ else \ @@ -253,7 +254,7 @@ void logic_out##bw(type value, unsigned long addr) \ } else if (addr >= MMIO_UPPER_LIMIT && addr < IO_SPACE_LIMIT) { \ struct logic_pio_hwaddr *entry = find_io_range(addr); \ \ - if (entry && entry->ops) \ + if (entry) \ entry->ops->out(entry->hostdata, \ addr, value, sizeof(type)); \ else \ @@ -261,7 +262,7 @@ void logic_out##bw(type value, unsigned long addr) \ } \ } \ \ -void logic_ins##bw(unsigned long addr, void *buffer, \ +void logic_ins##bw(unsigned long addr, void *buffer, \ unsigned int count) \ { \ if (addr < MMIO_UPPER_LIMIT) { \ @@ -269,7 +270,7 @@ void logic_ins##bw(unsigned long addr, void *buffer, \ } else if (addr >= MMIO_UPPER_LIMIT && addr < IO_SPACE_LIMIT) { \ struct logic_pio_hwaddr *entry = find_io_range(addr); \ \ - if (entry && entry->ops) \ + if (entry) \ entry->ops->ins(entry->hostdata, \ addr, buffer, sizeof(type), count); \ else \ @@ -286,7 +287,7 @@ void logic_outs##bw(unsigned long addr, const void *buffer, \ } else if (addr >= MMIO_UPPER_LIMIT && addr < IO_SPACE_LIMIT) { \ struct logic_pio_hwaddr *entry = find_io_range(addr); \ \ - if (entry && entry->ops) \ + if (entry) \ entry->ops->outs(entry->hostdata, \ addr, buffer, sizeof(type), count); \ else \