From patchwork Sat Feb 24 19:57:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Williams X-Patchwork-Id: 205917 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7300:a81b:b0:108:e6aa:91d0 with SMTP id bq27csp1299041dyb; Sat, 24 Feb 2024 11:58:25 -0800 (PST) X-Forwarded-Encrypted: i=3; AJvYcCX2XR3PI1z2bPyf4k6DT2oNtFHvEoylftmTZh0oyjY4x+b1nUnDZGGiFBS5OsVLNVzvu7vCt1p6LCLM5qzhMlvSmyMt9w== X-Google-Smtp-Source: AGHT+IGJz5f/YoMLa9aMKCGpaIut2dSe+9cBD4YzbjxppUBHlwGqIm8/BzGGhgN8aIqX4M3y8+9B X-Received: by 2002:a05:6a21:2d87:b0:1a0:f614:8480 with SMTP id ty7-20020a056a212d8700b001a0f6148480mr853113pzb.58.1708804705371; Sat, 24 Feb 2024 11:58:25 -0800 (PST) Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id t185-20020a632dc2000000b005dc3694a2f9si1253486pgt.659.2024.02.24.11.58.25 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 24 Feb 2024 11:58:25 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-79818-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b="Cwq/WLl5"; arc=fail (body hash mismatch); spf=pass (google.com: domain of linux-kernel+bounces-79818-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-79818-ouuuleilei=gmail.com@vger.kernel.org"; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 05FE1282C46 for ; Sat, 24 Feb 2024 19:58:25 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0474A4D108; Sat, 24 Feb 2024 19:58:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Cwq/WLl5" Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ADD5D4C63D; Sat, 24 Feb 2024 19:58:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=198.175.65.11 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708804693; cv=fail; b=tIVUvy+SWD1qilFdXRQ8fp82jgQIyQnfjd0vNseEC6SehMS4D/ZV/F9Kq7vtNZDazmHEFdynh0T4axQw2UpnFxW9Ze29ZMZsi+A+Q40cPd192X1sSCH1a9SVbtgAsIrDm2BztzUNOd/IQuPGqTFZV2FI3j1Js/2cb2NCVgM/z2g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1708804693; c=relaxed/simple; bh=YPN0hCcMNnGiX7dJVAD8KB3UF2CqHMbuJ0cN079NN6o=; h=Date:From:To:CC:Subject:Message-ID:Content-Type: Content-Disposition:MIME-Version; b=K+NamgFJbrrvx0dQQFaI+MzVLxossQJbpm1Si0aErM95LbIwdf0Zwv2st6bpkNBXCKcpx1JlhzMCkDf0f/2hULj55q93BLkqj1asX0jEL8ApAHGo/ne9fG0zav2qHy9uNsNcC93YMoZC4ISqU1UNi5/7Q/rE8gFifq+PRhmpMMg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com; spf=pass smtp.mailfrom=intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Cwq/WLl5; arc=fail smtp.client-ip=198.175.65.11 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1708804692; x=1740340692; h=date:from:to:cc:subject:message-id:mime-version; bh=YPN0hCcMNnGiX7dJVAD8KB3UF2CqHMbuJ0cN079NN6o=; b=Cwq/WLl54vBHH1OoADoWaNQnq7n2W+ut+DqY9TGz/jZIa4KdFk+AloTx iWjNDhi9NxjSQkuoICMeFDaEZ/W+mQ0AnYrMvmpml5xCJmPaNKDcgoXGD JsH8FC8oZhRUqF8Ee4cYsxfr9yjPaekOJF7Gc388JdelBK3WHqjAeOJ2K y2CHLlccxP3zP5NxQm8BpxR/qQgw/JI0xOMsAhLokSyHa0CxO9sVYuxuf BF/X2qSDIN8PavqrUoxPHmZFXFonhpqM0edRVdMHoCyKqDxfkc+MTiBoM dmlU12u3LYzccndUV4k6/ALfsLAhLjgocoFCnuHDjzoVOkBSxVB7uvUh5 A==; X-IronPort-AV: E=McAfee;i="6600,9927,10994"; a="13680797" X-IronPort-AV: E=Sophos;i="6.06,182,1705392000"; d="scan'208";a="13680797" Received: from orviesa008.jf.intel.com ([10.64.159.148]) by orvoesa103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Feb 2024 11:58:11 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.06,182,1705392000"; d="scan'208";a="6739081" Received: from fmsmsx603.amr.corp.intel.com ([10.18.126.83]) by orviesa008.jf.intel.com with ESMTP/TLS/AES256-GCM-SHA384; 24 Feb 2024 11:58:12 -0800 Received: from fmsmsx611.amr.corp.intel.com (10.18.126.91) by fmsmsx603.amr.corp.intel.com (10.18.126.83) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Sat, 24 Feb 2024 11:58:10 -0800 Received: from fmsmsx610.amr.corp.intel.com (10.18.126.90) by fmsmsx611.amr.corp.intel.com (10.18.126.91) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Sat, 24 Feb 2024 11:58:10 -0800 Received: from FMSEDG603.ED.cps.intel.com (10.1.192.133) by fmsmsx610.amr.corp.intel.com (10.18.126.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35 via Frontend Transport; Sat, 24 Feb 2024 11:58:10 -0800 Received: from NAM12-MW2-obe.outbound.protection.outlook.com (104.47.66.40) by edgegateway.intel.com (192.55.55.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.35; Sat, 24 Feb 2024 11:57:59 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VqjRk4G0cx4PGgPXwW7L5QV88zNQhayjm0s3Uy4mS1KjnPY06b8FeldhboMBraYJOEk8CD9Iec/VqR9Mu0TsQrXrMa4BbIhTbuGDnXOsc5i6N5LjNleWrPD+91J7BxJyFAj2nEoXEAsSA9idKQvxeV1v9ji8gx5nlF/fvfB+0oZ3VbdlWyWzUk6jyv9Z/t5CumIyVs1Yr9cRMCfsd+4+WrzlICZNxMiPSz6PH0Hg4pkfRUDOTirLaPKLm6+PLd7Tqo0uOjPBNdjC9RiFh3STGUzQznFM85oIcyRDod3iX0mjekIMGXXnvdrGcM6ry+wNcRzZ4qPCmb9Vq5QTETUl5Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=DVimpAPH1oI9+XZ/hyMq6jsB4k8XoP4YB66ikBSKEec=; b=iHD54ENKhGrqac7oj9rvLp56vQi17MTKGdFGr6Uk4WRZqftViWv1KfkKTp54G2fYDUam+MCjefB+d3vS3MTyZcEymLmklH7tmR7lPTsgHNoKCVJ35jnb4esyatyRYvfhTl6vu8v7obflUs8h3BmR1ULWQ4k08xGDGvtSelpXfkuR65aV9lxRzI0gndMDjgeegqCzkbavqVkPmEyWp/l2NRjqIW+k44cChqg/J+E3lnv2DJPM47MBI+VvZtlsldMGCuZ49mbfCXaYDLqwG19qjZkO08VYfqRMiMNvE0XS55Uzpuv6A9SIGHGYLBgExmA1qm0IE+tYAamnyHGasJHa+g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) by DM6PR11MB4577.namprd11.prod.outlook.com (2603:10b6:5:2a1::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7339.19; Sat, 24 Feb 2024 19:57:58 +0000 Received: from PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::82fd:75df:40d7:ed71]) by PH8PR11MB8107.namprd11.prod.outlook.com ([fe80::82fd:75df:40d7:ed71%4]) with mapi id 15.20.7339.019; Sat, 24 Feb 2024 19:57:57 +0000 Date: Sat, 24 Feb 2024 11:57:55 -0800 From: Dan Williams To: CC: , Subject: [GIT PULL] Compute Express Link (CXL) Fixes for 6.8-rc6 Message-ID: <65da4a4392d41_2bce929471@dwillia2-mobl3.amr.corp.intel.com.notmuch> Content-Disposition: inline X-ClientProxiedBy: MW4P223CA0015.NAMP223.PROD.OUTLOOK.COM (2603:10b6:303:80::20) To PH8PR11MB8107.namprd11.prod.outlook.com (2603:10b6:510:256::6) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PH8PR11MB8107:EE_|DM6PR11MB4577:EE_ X-MS-Office365-Filtering-Correlation-Id: 63b1eee9-8d65-4150-a5af-08dc3572e5b3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Jfi0/5wCKo8NNJyoBSJNgiPU6RwEm8ee1lCFNaW7gTqQg7nsNTD5rDPnwsIKTIkGm0JsPT5cAtEd8ZFeMtFYL7m8m2EI+gG9YnG7wZiGK8hz8sKl035/zTF99sLUDyXibl/dmcUB0t7Vd1tHfWwgh/Ne4oLPTmT6RTqBCzrBrnWJC4LV7NdIiXYI+K52MNqkM70JK1TC2thSaQoEOuStu59yh0MEAiv22PLqLzOmQz1Gm1b8mrWbwblhKM4YNo1eBPGxeu7K4Ck7wi3ReJqnEoLCOQgX9pmwspIdv93KWfeX0q0LTpW8YZhhBe+tIPgRUMKaW03JzBweEV74uG2mbVBZX3+3JQfsvhPZxLlbCaX83fKpJ8ys7TblPGCAmOVLwTMUdEH7g0tUU5dxI8wqame4xjd/l8zdyK9k1XOMMJwoz2+3lQJdAb6I0drAiVgyi+L87nW0bSeWRnZRRlOTiO/DcvwtpYFSVUgbKRodLrMAt8+fyiokoXmUgF+BKZApi7KXiqLcLbLx023lWkKeyXDJalYD6tnPSAvyGjS1/ko= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PH8PR11MB8107.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: GODeXMgIg+QQoT5HcQJWSSazcjjY5cyQnC/hlpAiJj2ZZF/eet6Vel7i3YZxscecVw+z6vLUMgFZHRNcpTG1vP9gHARzVwbOQVzlkDXANMXx/aL3v2JT/c+zDfo7OM9HLChh970JIALdFXhF62ZLMFpvIiv/f+rSQCxCYlp7wh7oeAlCvVsdpgGW3RBNNDG3O97/ynXu4+DLNFQs4SGaadPoIEakRJGAC6uENwCFFTnRjGBBdYU5PRHd+87cbaXvoSoZtYZ2zkmrkDThChYL38r+vMebco4GOrnipM+3G25EOz+B532IovX6oGFxXNoShxTytBXPc2In8QeZoVqTP22/szFGqisdvE36QFsmYjVVBJe5x5ncMUz1MmDPLe8v8jhtwcDuf3GP8Ranbeb6AKrT02vvwbSrF0kAfAPvYeGYJAKL6G1Kz895fgn2CrnPwOIaczWpppBunnyWlSizJ2LmFs8wZKS9nHjPmu54Y/7GgXi1GiyXx+uQyMpmjzfmmDi3wTaiJC6oI7qp+AAWGWjKXy7ir2QfenuKdLkadmHzHQ8MSnL8vpf/oh7jexQeoDoXfs+Vh9/oyQB8uTn8LqIglthWlILYKxymkFlbBZo/ztwZu93GnWUl2u69IS9/8cX/GE2bZYHbljT+ud6nHUc2wjZc+aL1I3W0G2022X/ruBevk0wsYazgZl8D6KWjCcaZTlvuH7+ChvBF/vPqMCuWR7ANSB1cLXWhz4THAu/uGTGgaMzKNH3ebo9TxTCk8qa4BTRYirquykNnjluH2vp4AlWTAHmcjc8p4y8eJEXhlORFsJUzGaHbL+TNu/WaxMDyafC5l1PA4MBxA1WauZLuFeFxp1KRDi6Epxe9rwQSqx7Wkrkde04RnZbOyys4EhRffBpwl7sRUZZBLF/52FTfuzyx8YNO1BWa5EcL+H6FPy4OqolPVHb+a4xAiP99iy+R9CdrDfp5q7L4qyQdTNpwR+0M/Xl32LL8LboAjF7VjXP5EyoI5OHCL7HI3Mx5N3H32hKenoCpveTrrefwLdDmwQub5GHPP82arL88bknEDCAv8NZt2CHa02RZYZwWnRySJ6ojeQK33XXaBwrbLegmsENOB+I15FAGv1akFK39qn+a9ehffI6nOKu6tJVGQLhhBx+y/3epXIun+AzL4O9vE3zgrWUM72AwUaMBWaXBcVIaW9m6yhePNJMlIPYiJILqs9Mmz1gkamiGbncB6+5FdGxWQ+24Gn62a88HFc05aVduB9rAisuLGIgBc10UBZOIrQr8B0IwUgGQAe9CLouxAubiZmHgip3uWksu+17W32Fy3UUqk0Cqcw7hOQ9m/3Kjzh78wpOqr/RAdvPy9qi9NZuX9RC2kdvHBPqjlmLEkqcf/oDVjwQToKWn6xW6U5gCZRxHIdANNo4/4OC/GqqK4u54xWgW6YXF/ikNk9i+xvVmkDOWoHDgbY//48i/N2aQq+wbI/z7n6obuVISczG8Q20NHk3wb/xCCvVGqKZ4QaKrySOEPNo2HAJrvRjttFr75Kg3/oV7Nv6VVHKhp5a/pvVUoUlppiEGTK+Lx3H+IsC8S7k6S4FHInrWcpsuBO3rGV2xvpJbbcFwTszjBg== X-MS-Exchange-CrossTenant-Network-Message-Id: 63b1eee9-8d65-4150-a5af-08dc3572e5b3 X-MS-Exchange-CrossTenant-AuthSource: PH8PR11MB8107.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Feb 2024 19:57:57.7558 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: FwquIGlVUlihQjJ5QpetBKjzTFxzFc0pDhFzCVZygKwHAjvXkRGk1cq2jmQRHpDuop96VC9vOp8/ZY1Or4P5fQ8U4Ov3G8weVUAyIuLpy6M= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR11MB4577 X-OriginatorOrg: intel.com X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1791811602756722486 X-GMAIL-MSGID: 1791811602756722486 Hi Linus, please pull from: git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl tags/cxl-fixes-6.8-rc6 ..to receive a collection of significant fixes for the CXL subsystem. The largest change in this set, that bordered on "new development", is the fix for the fact that the location of the new qos_class attribute did not match the Documentation. The fix ends up deleting more code than it added, and it has a new unit test to backstop basic errors in this interface going forward. So the "red-diff" and unit test saved the "rip it out and try again" response. In contrast, the new notification path for firmware reported CXL errors (CXL CPER notifications) has a locking context bug that can not be fixed with a red-diff. Given where the release cycle stands, it is not comfortable to squeeze in that fix in these waning days. So, that receives the "back it out and try again later" treatment. There is a regression fix in the code that establishes memory NUMA nodes for platform CXL regions. That has an ack from x86 folks. There are a couple more fixups for Linux to understand (reassemble) CXL regions instantiated by platform firmware. The policy around platforms that do not match host-physical-address with system-physical-address (i.e. systems that have an address translation mechanism between the address range reported in the ACPI CEDT.CFMWS and endpoint decoders) has been softened to abort driver load rather than teardown the memory range (can cause system hangs). Lastly, there is a robustness / regression fix for cases where the driver would previously continue in the face of error, and a fixup for PCI error notification handling. This has a build success notification from the kbuild-robot. Stephen noticed that I needed to rebase the cxl/next branch which pushed out this pull request by a week, but no other linux-next reports since. --- The following changes since commit b401b621758e46812da61fa58a67c3fd8d91de0d: Linux 6.8-rc5 (2024-02-18 12:56:25 -0800) are available in the Git repository at: git://git.kernel.org/pub/scm/linux/kernel/git/cxl/cxl tags/cxl-fixes-6.8-rc6 for you to fetch changes up to 5c6224bfabbf7f3e491c51ab50fd2c6f92ba1141: cxl/acpi: Fix load failures due to single window creation failure (2024-02-20 22:58:05 -0800) ---------------------------------------------------------------- cxl fixes for 6.8-rc6 - Fix NUMA initialization from ACPI CEDT.CFMWS - Fix region assembly failures due to async init order - Fix / simplify export of qos_class information - Fix cxl_acpi initialization vs single-window-init failures - Fix handling of repeated 'pci_channel_io_frozen' notifications - Workaround platforms that violate host-physical-address == system-physical address assumptions - Defer CXL CPER notification handling to v6.9 ---------------------------------------------------------------- Alison Schofield (4): x86/numa: Fix the address overlap check in numa_fill_memblks() x86/numa: Fix the sort compare func used in numa_fill_memblks() cxl/region: Handle endpoint decoders in cxl_region_find_decoder() cxl/region: Allow out of order assembly of autodiscovered regions Dan Williams (3): acpi/ghes: Remove CXL CPER notifications Merge branch 'for-6.8/cxl-cper' into for-6.8/cxl cxl/acpi: Fix load failures due to single window creation failure Dave Jiang (4): cxl: Change 'struct cxl_memdev_state' *_perf_list to single 'struct cxl_dpa_perf' cxl: Remove unnecessary type cast in cxl_qos_class_verify() cxl: Fix sysfs export of qos_class for memdev cxl/test: Add support for qos_class checking Li Ming (1): cxl/pci: Skip to handle RAS errors if CXL.mem device is detached Robert Richter (1): cxl/pci: Fix disabling memory if DVSEC CXL Range does not match a CFMWS window arch/x86/mm/numa.c | 21 ++++------- drivers/acpi/apei/ghes.c | 63 ------------------------------- drivers/cxl/acpi.c | 46 ++++++++++++++--------- drivers/cxl/core/cdat.c | 86 +++++++++++++------------------------------ drivers/cxl/core/mbox.c | 4 +- drivers/cxl/core/memdev.c | 63 +++++++++++++++++++++++++++++++ drivers/cxl/core/pci.c | 49 ++++++++++++++++-------- drivers/cxl/core/region.c | 62 +++++++++++++++++++++++-------- drivers/cxl/cxl.h | 2 + drivers/cxl/cxlmem.h | 10 ++--- drivers/cxl/mem.c | 56 ---------------------------- drivers/cxl/pci.c | 57 +--------------------------- include/linux/cxl-event.h | 18 --------- include/linux/memblock.h | 2 + mm/memblock.c | 5 ++- tools/testing/cxl/Kbuild | 1 + tools/testing/cxl/test/cxl.c | 63 ++++++++++++++++++++++++++----- tools/testing/cxl/test/mock.c | 14 +++++++ tools/testing/cxl/test/mock.h | 1 + 19 files changed, 289 insertions(+), 334 deletions(-)