From patchwork Thu Aug 15 05:58:44 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yinghai Lu X-Patchwork-Id: 2844981 Return-Path: X-Original-To: patchwork-linux-acpi@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 5E14F9F271 for ; Thu, 15 Aug 2013 05:59:14 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6EBF820416 for ; Thu, 15 Aug 2013 05:59:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7D1EB20414 for ; Thu, 15 Aug 2013 05:59:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753726Ab3HOF6x (ORCPT ); Thu, 15 Aug 2013 01:58:53 -0400 Received: from userp1040.oracle.com ([156.151.31.81]:34355 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753702Ab3HOF6v (ORCPT ); Thu, 15 Aug 2013 01:58:51 -0400 Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.1/Sentrion-MTA-4.3.1) with ESMTP id r7F5wa0J012970 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 15 Aug 2013 05:58:37 GMT Received: from aserz7021.oracle.com (aserz7021.oracle.com [141.146.126.230]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r7F5wVhM011473 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Thu, 15 Aug 2013 05:58:34 GMT Received: from abhmt117.oracle.com (abhmt117.oracle.com [141.146.116.69]) by aserz7021.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id r7F5wVDh003074; Thu, 15 Aug 2013 05:58:31 GMT Received: from linux-siqj.site.site (/75.36.246.31) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 14 Aug 2013 22:58:30 -0700 From: Yinghai Lu To: "Rafael J. Wysocki" , "H. Peter Anvin" Cc: Tejun Heo , Thomas Renninger , Tang Chen , Toshi Kani , Len Brown , linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org, Yinghai Lu Subject: [PATCH] x86, ACPI: Increase override tables number limit Date: Wed, 14 Aug 2013 22:58:44 -0700 Message-Id: <1376546324-2461-1-git-send-email-yinghai@kernel.org> X-Mailer: git-send-email 1.8.1.4 X-Source-IP: acsinet22.oracle.com [141.146.126.238] Sender: linux-acpi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-acpi@vger.kernel.org X-Spam-Status: No, score=-9.7 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Current acpi tables in initrd is limited to 10, that is too small. 64 should be good enough as we have 35 sigs and could have several SSDT. Two problems in current code prevent us from increasing limit: 1. that cpio file info array is put in stack, as every element is 32 bytes, could run out of stack if we have that array size to 64. We can move it out from stack, and make it as global and put it in __initdata section. 2. early_ioremap only can remap 256k one time. Current code is mapping 10 tables one time. If we increase that limit, whole size could be more than 256k, early_ioremap will fail with that. We can map table one by one during copying, instead of mapping all them one time. -v2: According to tj, split it out to separated patch, also rename array name to acpi_initrd_files. -v3: Add some comments about mapping table one by one during copying per tj. Signed-off-by: Yinghai Cc: Rafael J. Wysocki Cc: linux-acpi@vger.kernel.org Acked-by: Tejun Heo Tested-by: Thomas Renninger Reviewed-by: Tang Chen Tested-by: Tang Chen Acked-by: Toshi Kani --- drivers/acpi/osl.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Index: linux-2.6/drivers/acpi/osl.c =================================================================== --- linux-2.6.orig/drivers/acpi/osl.c +++ linux-2.6/drivers/acpi/osl.c @@ -569,8 +569,8 @@ static const char * const table_sigs[] = #define ACPI_HEADER_SIZE sizeof(struct acpi_table_header) -/* Must not increase 10 or needs code modification below */ -#define ACPI_OVERRIDE_TABLES 10 +#define ACPI_OVERRIDE_TABLES 64 +static struct cpio_data __initdata acpi_initrd_files[ACPI_OVERRIDE_TABLES]; void __init acpi_initrd_override(void *data, size_t size) { @@ -579,7 +579,6 @@ void __init acpi_initrd_override(void *d struct acpi_table_header *table; char cpio_path[32] = "kernel/firmware/acpi/"; struct cpio_data file; - struct cpio_data early_initrd_files[ACPI_OVERRIDE_TABLES]; char *p; if (data == NULL || size == 0) @@ -617,8 +616,8 @@ void __init acpi_initrd_override(void *d table->signature, cpio_path, file.name, table->length); all_tables_size += table->length; - early_initrd_files[table_nr].data = file.data; - early_initrd_files[table_nr].size = file.size; + acpi_initrd_files[table_nr].data = file.data; + acpi_initrd_files[table_nr].size = file.size; table_nr++; } if (table_nr == 0) @@ -648,14 +647,19 @@ void __init acpi_initrd_override(void *d memblock_reserve(acpi_tables_addr, all_tables_size); arch_reserve_mem_area(acpi_tables_addr, all_tables_size); - p = early_ioremap(acpi_tables_addr, all_tables_size); - + /* + * early_ioremap only can remap 256k one time. If we map all + * tables one time, we will hit the limit. Need to map table + * one by one during copying. + */ for (no = 0; no < table_nr; no++) { - memcpy(p + total_offset, early_initrd_files[no].data, - early_initrd_files[no].size); - total_offset += early_initrd_files[no].size; + phys_addr_t size = acpi_initrd_files[no].size; + + p = early_ioremap(acpi_tables_addr + total_offset, size); + memcpy(p, acpi_initrd_files[no].data, size); + early_iounmap(p, size); + total_offset += size; } - early_iounmap(p, all_tables_size); } #endif /* CONFIG_ACPI_INITRD_TABLE_OVERRIDE */