Received: by 10.213.65.68 with SMTP id h4csp154585imn; Fri, 30 Mar 2018 03:00:13 -0700 (PDT) X-Google-Smtp-Source: AIpwx49OL+92EHymhtn8YkJ4KCNmBu4qq7WmRVfemoilyFbQ5KfmN10FpCLKBVyQMNImGQcoWOw5 X-Received: by 2002:a17:902:8348:: with SMTP id z8-v6mr6393288pln.311.1522404013045; Fri, 30 Mar 2018 03:00:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522404013; cv=none; d=google.com; s=arc-20160816; b=gBNXxgo5shYkS4niGrqYR6qobAhysqPnO5DMVzLrWxRpmlbKMgIvpVsAtP4gnm50i8 pbJS5Zg0wjVga2T2gi7UmEE9jvg+UUagMIT1bvg1M3GIx0arLbn51FqHYIERyqtVhWjT LtgKrnXc8nWWUf5kCOiFNnScXjThM6ZHep6sDxAMqwnb1EW5dwp4zhJTgpB5wt3/OA8P Pd+ynt3npDz7ntmVgLOzjW8M1qKcgYYdtgwMWv7ZGNygrNpOLxvhlVpEQnd+1OLWI2VA YPxrx0VLkgW0VDH0tI2Doo8M+fiuDbH7qzSrRGPXUzIIX3d1ylPczJUmT5ApefZNXVQP AkpQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:references:cc:to:from:subject:arc-authentication-results; bh=mUhiDjezUlQkyezUknT2++8sdVFw+QcJooy2wCFhuvc=; b=eSTXElsFKa1Qzj20Nlfac0KM1T0EU2yUxDFQH+fguf9jbqoBnUsInvJtAyNEOKBttX +clDibNSbnCkvT+Ql00H2n8t6n1Jd8dGT8N2gw890UpKgR2rG1cXIQAryCBdGiOfp0SQ fWBFMmnc/+Hscg8f42xKRSKqufFxXD94pCdwbVFZY8GpxKNQxNWa9xLGh7kGxVT+tXaf 6Pz72nipQPEEAN1x6WzcKoS5POp+lsWsANU15VVm87TYs0E8MKmAyKpY+zGrZlc+bNEu GWgnpbhLMnw0J1+b/kIGoQLWTqbKSuxvUJ3gSs7xcSrnrBFzl8TlcTn/sZXJYY5bZago 3CgA== 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 t13si5400861pgr.205.2018.03.30.02.59.59; Fri, 30 Mar 2018 03:00:13 -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 S1751250AbeC3J65 (ORCPT + 99 others); Fri, 30 Mar 2018 05:58:57 -0400 Received: from wp227.webpack.hosteurope.de ([80.237.132.234]:46418 "EHLO wp227.webpack.hosteurope.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751057AbeC3J6y (ORCPT ); Fri, 30 Mar 2018 05:58:54 -0400 Received: from ip4d15e3ad.dynamic.kabel-deutschland.de ([77.21.227.173] helo=[192.168.66.118]); authenticated by wp227.webpack.hosteurope.de running ExIM with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) id 1f1qo1-0004pa-GU; Fri, 30 Mar 2018 11:58:45 +0200 Subject: Re: [PATCH AUTOSEL for 4.15 116/124] genirq/affinity: assign vectors to all possible CPUs From: Thorsten Leemhuis To: Sasha Levin , "linux-kernel@vger.kernel.org" , "stable@vger.kernel.org" Cc: Christoph Hellwig , Thomas Gleixner , Jens Axboe References: <20180319154645.11350-1-alexander.levin@microsoft.com> <20180319154645.11350-116-alexander.levin@microsoft.com> <0b7c5fd8-118c-6174-3078-c8ff53cb53cd@leemhuis.info> Message-ID: Date: Fri, 30 Mar 2018 11:58:44 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 MIME-Version: 1.0 In-Reply-To: <0b7c5fd8-118c-6174-3078-c8ff53cb53cd@leemhuis.info> Content-Type: text/plain; charset=utf-8 Content-Language: en-MW Content-Transfer-Encoding: 8bit X-bounce-key: webpack.hosteurope.de;regressions@leemhuis.info;1522403934;ce274d72; X-HE-SMSGID: 1f1qo1-0004pa-GU Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Lo! On 27.03.2018 20:33, Thorsten Leemhuis wrote: > On 19.03.2018 16:49, Sasha Levin wrote: >> From: Christoph Hellwig >> [ Upstream commit 84676c1f21e8ff54befe985f4f14dc1edc10046b ] > TWIMC: That commit (also reported by autosel for 4.14) triggered a > regression in 4.16 reported by Artem Bityutskiy in "regression: > SCSI/SATA failure" (https://marc.info/?l=linux-kernel&m=151931128006031 > ). […] For the record, from what I head it in between was fixed by these: 2f31115e940c scsi: core: introduce force_blk_mq 8b834bff1b73 scsi: hpsa: fix selection of reply queue adbe552349f2 scsi: megaraid_sas: fix selection of reply queue c3506df85091 scsi: virtio_scsi: unify scsi_host_template b5b6e8c8d3b4 scsi: virtio_scsi: fix IO hang caused by automatic irq vector affinity Ciao, Thorsten >> Currently we assign managed interrupt vectors to all present CPUs. This >> works fine for systems were we only online/offline CPUs. But in case of >> systems that support physical CPU hotplug (or the virtualized version of >> it) this means the additional CPUs covered for in the ACPI tables or on >> the command line are not catered for. To fix this we'd either need to >> introduce new hotplug CPU states just for this case, or we can start >> assining vectors to possible but not present CPUs. >> >> Reported-by: Christian Borntraeger >> Tested-by: Christian Borntraeger >> Tested-by: Stefan Haberland >> Fixes: 4b855ad37194 ("blk-mq: Create hctx for each present CPU") >> Cc: linux-kernel@vger.kernel.org >> Cc: Thomas Gleixner >> Signed-off-by: Christoph Hellwig >> Signed-off-by: Jens Axboe >> Signed-off-by: Sasha Levin >> --- >> kernel/irq/affinity.c | 30 +++++++++++++++--------------- >> 1 file changed, 15 insertions(+), 15 deletions(-) >> >> diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c >> index e12d35108225..a37a3b4b6342 100644 >> --- a/kernel/irq/affinity.c >> +++ b/kernel/irq/affinity.c >> @@ -39,7 +39,7 @@ static void irq_spread_init_one(struct cpumask *irqmsk, struct cpumask *nmsk, >> } >> } >> >> -static cpumask_var_t *alloc_node_to_present_cpumask(void) >> +static cpumask_var_t *alloc_node_to_possible_cpumask(void) >> { >> cpumask_var_t *masks; >> int node; >> @@ -62,7 +62,7 @@ static cpumask_var_t *alloc_node_to_present_cpumask(void) >> return NULL; >> } >> >> -static void free_node_to_present_cpumask(cpumask_var_t *masks) >> +static void free_node_to_possible_cpumask(cpumask_var_t *masks) >> { >> int node; >> >> @@ -71,22 +71,22 @@ static void free_node_to_present_cpumask(cpumask_var_t *masks) >> kfree(masks); >> } >> >> -static void build_node_to_present_cpumask(cpumask_var_t *masks) >> +static void build_node_to_possible_cpumask(cpumask_var_t *masks) >> { >> int cpu; >> >> - for_each_present_cpu(cpu) >> + for_each_possible_cpu(cpu) >> cpumask_set_cpu(cpu, masks[cpu_to_node(cpu)]); >> } >> >> -static int get_nodes_in_cpumask(cpumask_var_t *node_to_present_cpumask, >> +static int get_nodes_in_cpumask(cpumask_var_t *node_to_possible_cpumask, >> const struct cpumask *mask, nodemask_t *nodemsk) >> { >> int n, nodes = 0; >> >> /* Calculate the number of nodes in the supplied affinity mask */ >> for_each_node(n) { >> - if (cpumask_intersects(mask, node_to_present_cpumask[n])) { >> + if (cpumask_intersects(mask, node_to_possible_cpumask[n])) { >> node_set(n, *nodemsk); >> nodes++; >> } >> @@ -109,7 +109,7 @@ irq_create_affinity_masks(int nvecs, const struct irq_affinity *affd) >> int last_affv = affv + affd->pre_vectors; >> nodemask_t nodemsk = NODE_MASK_NONE; >> struct cpumask *masks; >> - cpumask_var_t nmsk, *node_to_present_cpumask; >> + cpumask_var_t nmsk, *node_to_possible_cpumask; >> >> /* >> * If there aren't any vectors left after applying the pre/post >> @@ -125,8 +125,8 @@ irq_create_affinity_masks(int nvecs, const struct irq_affinity *affd) >> if (!masks) >> goto out; >> >> - node_to_present_cpumask = alloc_node_to_present_cpumask(); >> - if (!node_to_present_cpumask) >> + node_to_possible_cpumask = alloc_node_to_possible_cpumask(); >> + if (!node_to_possible_cpumask) >> goto out; >> >> /* Fill out vectors at the beginning that don't need affinity */ >> @@ -135,8 +135,8 @@ irq_create_affinity_masks(int nvecs, const struct irq_affinity *affd) >> >> /* Stabilize the cpumasks */ >> get_online_cpus(); >> - build_node_to_present_cpumask(node_to_present_cpumask); >> - nodes = get_nodes_in_cpumask(node_to_present_cpumask, cpu_present_mask, >> + build_node_to_possible_cpumask(node_to_possible_cpumask); >> + nodes = get_nodes_in_cpumask(node_to_possible_cpumask, cpu_possible_mask, >> &nodemsk); >> >> /* >> @@ -146,7 +146,7 @@ irq_create_affinity_masks(int nvecs, const struct irq_affinity *affd) >> if (affv <= nodes) { >> for_each_node_mask(n, nodemsk) { >> cpumask_copy(masks + curvec, >> - node_to_present_cpumask[n]); >> + node_to_possible_cpumask[n]); >> if (++curvec == last_affv) >> break; >> } >> @@ -160,7 +160,7 @@ irq_create_affinity_masks(int nvecs, const struct irq_affinity *affd) >> vecs_per_node = (affv - (curvec - affd->pre_vectors)) / nodes; >> >> /* Get the cpus on this node which are in the mask */ >> - cpumask_and(nmsk, cpu_present_mask, node_to_present_cpumask[n]); >> + cpumask_and(nmsk, cpu_possible_mask, node_to_possible_cpumask[n]); >> >> /* Calculate the number of cpus per vector */ >> ncpus = cpumask_weight(nmsk); >> @@ -192,7 +192,7 @@ irq_create_affinity_masks(int nvecs, const struct irq_affinity *affd) >> /* Fill out vectors at the end that don't need affinity */ >> for (; curvec < nvecs; curvec++) >> cpumask_copy(masks + curvec, irq_default_affinity); >> - free_node_to_present_cpumask(node_to_present_cpumask); >> + free_node_to_possible_cpumask(node_to_possible_cpumask); >> out: >> free_cpumask_var(nmsk); >> return masks; >> @@ -214,7 +214,7 @@ int irq_calc_affinity_vectors(int minvec, int maxvec, const struct irq_affinity >> return 0; >> >> get_online_cpus(); >> - ret = min_t(int, cpumask_weight(cpu_present_mask), vecs) + resv; >> + ret = min_t(int, cpumask_weight(cpu_possible_mask), vecs) + resv; >> put_online_cpus(); >> return ret; >> } >>