Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp7470306ybl; Tue, 24 Dec 2019 03:13:18 -0800 (PST) X-Google-Smtp-Source: APXvYqxZr06AutgXcDb05CSPossJJ0WmBHE/4vjnazoJLcTK3qk9OqXV7w8KGWUci30BzbVBiq6M X-Received: by 2002:a9d:2c68:: with SMTP id f95mr38578557otb.33.1577185998634; Tue, 24 Dec 2019 03:13:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1577185998; cv=none; d=google.com; s=arc-20160816; b=eJfIcM+J7f8jUYW9R/1HIaouhzjk6PUBgO4FvpljL95fJEa2HgyXbryJDShjL9vhAw BcyTxIRz3HsgAxUyo9r9TH+PUIwvDLfIdk/tYQdauq5oCGipktXqRryMc2hD4axpd/dM 6K5J+HDNOp9RzOmGTEa/U8QY8O5o4Caw0iTfPk4UX89RDSoBfjueszRoMjYIcHlPmsTY f1b+tBg8oWHrZKXdACJE6sfgV5pFpqgXYDR+U8YntN3ZTXv54IKCtEqGxFScAeg2D1uk ++ROX0KqcEybyowCV0B1pcOphbHQNqu2kpwhItt8CJEK4Y6F+/0MHgb57SHfkVs6qQIT M9qQ== 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:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=AmjxrKBzULxQ15VSkuSV778Rvz0MUDSg5MUPUitTOJs=; b=rcvsZK6pEyKNS96OG1aEunqDNwAOaRu+ES4DJSnaCLn3bfZtFXb/mrynF9j4BGMWry hwDf1Ph1/3aWObFtKGUpwZjhNdm2ldDVLW1270aN8suZJBXjurbrh/cq7cPnIAZKiF5X 3P16oggJQPPslaSoea/rD/F2PtofS6mzy8FEmJgqJPUWv5TBGdpq26SkL0YtyLOjiA4r hLs9FOtDqPmNf9BWCzJ+7i8lTBYKRt/iaQFJ7qMZ3rnFsUrtvYRmcc5A0bwdrti9Abgb mDwFkW0ReCfAez3G/Qk+/0dHwrHuInZYHYUEudP+hE+uU4b8Cu+HBNlQqpCeADjDAGuu YnTg== 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=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j18si11750419otq.275.2019.12.24.03.13.06; Tue, 24 Dec 2019 03:13:18 -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=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727015AbfLXLLX (ORCPT + 99 others); Tue, 24 Dec 2019 06:11:23 -0500 Received: from inca-roads.misterjones.org ([213.251.177.50]:37476 "EHLO inca-roads.misterjones.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726298AbfLXLLS (ORCPT ); Tue, 24 Dec 2019 06:11:18 -0500 Received: from 78.163-31-62.static.virginmediabusiness.co.uk ([62.31.163.78] helo=why.lan) by cheepnis.misterjones.org with esmtpsa (TLSv1.2:DHE-RSA-AES128-GCM-SHA256:128) (Exim 4.80) (envelope-from ) id 1iji5s-000169-GZ; Tue, 24 Dec 2019 12:11:16 +0100 From: Marc Zyngier To: kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org Cc: Eric Auger , James Morse , Julien Thierry , Suzuki K Poulose , Thomas Gleixner , Jason Cooper , Lorenzo Pieralisi , Andrew Murray , Zenghui Yu , Robert Richter Subject: [PATCH v3 08/32] irqchip/gic-v4.1: Implement the v4.1 flavour of VMOVP Date: Tue, 24 Dec 2019 11:10:31 +0000 Message-Id: <20191224111055.11836-9-maz@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191224111055.11836-1-maz@kernel.org> References: <20191224111055.11836-1-maz@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 62.31.163.78 X-SA-Exim-Rcpt-To: kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org, eric.auger@redhat.com, james.morse@arm.com, julien.thierry.kdev@gmail.com, suzuki.poulose@arm.com, tglx@linutronix.de, jason@lakedaemon.net, lorenzo.pieralisi@arm.com, Andrew.Murray@arm.com, yuzenghui@huawei.com, rrichter@marvell.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on cheepnis.misterjones.org); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org With GICv4.1, VMOVP is extended to allow a default doorbell to be specified, as well as a validity bit for this doorbell. As an added bonus, VMOVP isn't required anymore of moving a VPE between redistributors that share the same affinity. Let's add this support to the VMOVP builder, and make sure we don't issue the command if we don't really need to. Reviewed-by: Zenghui Yu Signed-off-by: Marc Zyngier --- drivers/irqchip/irq-gic-v3-its.c | 40 ++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 86c69b5cc156..fd9d3b6bb465 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -471,6 +471,17 @@ static void its_encode_vmapp_default_db(struct its_cmd_block *cmd, its_mask_encode(&cmd->raw_cmd[1], vpe_db_lpi, 31, 0); } +static void its_encode_vmovp_default_db(struct its_cmd_block *cmd, + u32 vpe_db_lpi) +{ + its_mask_encode(&cmd->raw_cmd[3], vpe_db_lpi, 31, 0); +} + +static void its_encode_db(struct its_cmd_block *cmd, bool db) +{ + its_mask_encode(&cmd->raw_cmd[2], db, 63, 63); +} + static inline void its_fixup_cmd(struct its_cmd_block *cmd) { /* Let's fixup BE commands */ @@ -757,6 +768,11 @@ static struct its_vpe *its_build_vmovp_cmd(struct its_node *its, its_encode_vpeid(cmd, desc->its_vmovp_cmd.vpe->vpe_id); its_encode_target(cmd, target); + if (is_v4_1(its)) { + its_encode_db(cmd, true); + its_encode_vmovp_default_db(cmd, desc->its_vmovp_cmd.vpe->vpe_db_lpi); + } + its_fixup_cmd(cmd); return valid_vpe(its, desc->its_vmovp_cmd.vpe); @@ -3328,7 +3344,7 @@ static int its_vpe_set_affinity(struct irq_data *d, bool force) { struct its_vpe *vpe = irq_data_get_irq_chip_data(d); - int cpu = cpumask_first(mask_val); + int from, cpu = cpumask_first(mask_val); /* * Changing affinity is mega expensive, so let's be as lazy as @@ -3336,14 +3352,24 @@ static int its_vpe_set_affinity(struct irq_data *d, * into the proxy device, we need to move the doorbell * interrupt to its new location. */ - if (vpe->col_idx != cpu) { - int from = vpe->col_idx; + if (vpe->col_idx == cpu) + goto out; - vpe->col_idx = cpu; - its_send_vmovp(vpe); - its_vpe_db_proxy_move(vpe, from, cpu); - } + from = vpe->col_idx; + vpe->col_idx = cpu; + + /* + * GICv4.1 allows us to skip VMOVP if moving to a cpu whose RD + * is sharing its VPE table with the current one. + */ + if (gic_data_rdist_cpu(cpu)->vpe_table_mask && + cpumask_test_cpu(from, gic_data_rdist_cpu(cpu)->vpe_table_mask)) + goto out; + its_send_vmovp(vpe); + its_vpe_db_proxy_move(vpe, from, cpu); + +out: irq_data_update_effective_affinity(d, cpumask_of(cpu)); return IRQ_SET_MASK_OK_DONE; -- 2.20.1