Received: by 2002:a05:6358:d09b:b0:dc:cd0c:909e with SMTP id jc27csp5636121rwb; Mon, 5 Dec 2022 01:48:58 -0800 (PST) X-Google-Smtp-Source: AA0mqf4f6xf6JHL40jp1LLW7kd/MUss5X0WGNH9KZG7QGuNWhj65BLAIadoSFXBxg85sPpO/qTtS X-Received: by 2002:a17:903:d1:b0:189:c4b4:b374 with SMTP id x17-20020a17090300d100b00189c4b4b374mr11542422plc.72.1670233738097; Mon, 05 Dec 2022 01:48:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670233738; cv=none; d=google.com; s=arc-20160816; b=MyVWdt9oRtXn295WiSemlfm05vVtoNfh+XxKezNK/Zd4u5i7iD1cSeWrfG/Sfq3v76 6tY8cYKxyBXW6oxJkS68ynq45bEfungKjFSVk46rP2sNmw4URNiTLguTBN9lCv4aHQBn H7Latfpp/1T+58JzN0cmd3Z6sse83k/4Qpf2L20JxZ6LDsv2RaaQNlBg0zuyaFWOkJxr e6tY6WqRg8A/lT/I2gyqOt/9pa6WreoeIcpqVYnVV7OZWV5RCUvmv6GxX2qO8+8g/ay1 LQYmrkn5pcJSToz3zB8ydHVw6eIz+hTFKzHZKf2aDQv0nnuaUD+UEpoOZvNaI/5jTQO7 9fZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=SbUN/Ko04SNzoBySAaB7G+D6Ee//XjJqOiItc7bmihU=; b=nvRTX+Wm7Nq2xPBP+eLcHBeVnp3vZVRhBEmbI1gviXOtOAgp75uXEGb6u6THUVJ2fc WXYgr+44PD28rRvN7qkIPTF0IOjgyABotEM0tTy/rufeps+SYKkrhbVV3tCkAsIkamjs yUezbiVdBostUk1hZC3sbRLTFuTpDjNUDg8FwRa4tM/iPqbE0O/83MyTCrcf2MKojxB5 CzgAul7ISMxjfT3QanxXKXBRufrZOvZ8BD9/fnN7eNLjhXiDCzfavFOdya/fxMyI3jO9 8/6rzVWRyBvhZBvOr8AK9RIVPogdvK3aANi+YmcjVcE+Xu1FASibJFT4304u0KfRT5ib ylGw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@bytedance-com.20210112.gappssmtp.com header.s=20210112 header.b=PU3O4v2c; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=bytedance.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id nv8-20020a17090b1b4800b00217ec4647afsi16290005pjb.14.2022.12.05.01.48.48; Mon, 05 Dec 2022 01:48:58 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@bytedance-com.20210112.gappssmtp.com header.s=20210112 header.b=PU3O4v2c; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=bytedance.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231671AbiLEJB1 (ORCPT + 82 others); Mon, 5 Dec 2022 04:01:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47700 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231904AbiLEJAn (ORCPT ); Mon, 5 Dec 2022 04:00:43 -0500 Received: from mail-pg1-x534.google.com (mail-pg1-x534.google.com [IPv6:2607:f8b0:4864:20::534]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 05DC26426 for ; Mon, 5 Dec 2022 00:59:07 -0800 (PST) Received: by mail-pg1-x534.google.com with SMTP id q71so9913539pgq.8 for ; Mon, 05 Dec 2022 00:59:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SbUN/Ko04SNzoBySAaB7G+D6Ee//XjJqOiItc7bmihU=; b=PU3O4v2cQ68yHc6IM8LwdPnVejbvUKQh3EhLMNBFT8BoTrTB5xYC+K7usjaOi6IIdq kmHAB+GDafvHchHAP4Ll8tOEvxqZZCHIYOhdV++DIFj6gF8yGCo9eCANPrCu7cTFYT0h 3iZwyjWwGa/33rxA8gEJ49Lg4x96x9AYDrV6cQZKtqnyt5cIfpb2xEqbMa+yuW3ivl2f QIrVUZFVkD1qRuf015T6SANDjzE+2+A/QHP3EandFeQUgJjmog8pa3PukdCxfo0zNOjp a/5Ua7zJ5uijTSW5rsIx58IxSFQ0/s0Oq2Ou6Qaz5bozmliCAqic7EUZvJV5JY6XjM0B atew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SbUN/Ko04SNzoBySAaB7G+D6Ee//XjJqOiItc7bmihU=; b=GHkYA+CbVXUE4yKpT1S+KQM0w7uT4DuFtXoZyT3AVfihg2plcnBUSJPsN9aAQJkz1v QAM/Iq6T1mqR8ipS6vbD+n/Cw2LN5KgaIsR8DDNX9ifziqhRcs2T9tYwS/U4va0jkF/J hK6DlGVogBG0/14mtHUBemVSQ5vR3f77rdzuDWl2sgfsQEhWzzkCdpIGuCVA1qiR2KkP Ge5GLzx/jZHfH+aTp6+tHYruku2/boe0iyUQ+YBiLPEkkyLHesICZuFqPMYNBaudwSrn NfaR/5wpkMteSdXuS4khxZ/Pd9J1dz50q8+vKcFnh4gy/JxTaqn9xmdc4fNaf8wBa3oi LT+w== X-Gm-Message-State: ANoB5pn1G+NTtjyIxr1aeDnvr9WCO4ihacpDdOxL5nKDXvhD0IEo/Dwx an0YLg30Ij6Zruy6xZWoMTAh X-Received: by 2002:a63:545d:0:b0:476:d44d:358 with SMTP id e29-20020a63545d000000b00476d44d0358mr72628703pgm.521.1670230746520; Mon, 05 Dec 2022 00:59:06 -0800 (PST) Received: from localhost ([101.229.232.206]) by smtp.gmail.com with ESMTPSA id e4-20020a056a0000c400b0057709fce782sm910735pfj.54.2022.12.05.00.59.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Dec 2022 00:59:06 -0800 (PST) From: Xie Yongji To: mst@redhat.com, jasowang@redhat.com, tglx@linutronix.de, hch@lst.de Cc: virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 06/11] vduse: Support automatic irq callback affinity Date: Mon, 5 Dec 2022 16:58:41 +0800 Message-Id: <20221205085846.741-1-xieyongji@bytedance.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221205084127.535-1-xieyongji@bytedance.com> References: <20221205084127.535-1-xieyongji@bytedance.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This brings current interrupt affinity spreading mechanism to vduse device. We will make use of irq_create_affinity_masks() to create an irq callback affinity mask for each virtqueue of vduse device. Then we will choose the CPU which has the lowest number of interrupt allocated in the affinity mask to run the irq callback. Signed-off-by: Xie Yongji --- drivers/vdpa/vdpa_user/vduse_dev.c | 50 ++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/drivers/vdpa/vdpa_user/vduse_dev.c b/drivers/vdpa/vdpa_user/vduse_dev.c index d126f3e32a20..90c2896039d9 100644 --- a/drivers/vdpa/vdpa_user/vduse_dev.c +++ b/drivers/vdpa/vdpa_user/vduse_dev.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -58,6 +59,8 @@ struct vduse_virtqueue { struct work_struct inject; struct work_struct kick; int irq_effective_cpu; + struct cpumask irq_affinity; + spinlock_t irq_affinity_lock; }; struct vduse_dev; @@ -123,6 +126,7 @@ struct vduse_control { static DEFINE_MUTEX(vduse_lock); static DEFINE_IDR(vduse_idr); +static DEFINE_PER_CPU(unsigned long, vduse_allocated_irq); static dev_t vduse_major; static struct class *vduse_class; @@ -710,6 +714,49 @@ static u32 vduse_vdpa_get_generation(struct vdpa_device *vdpa) return dev->generation; } +static void vduse_vq_update_effective_cpu(struct vduse_virtqueue *vq) +{ + unsigned int cpu, best_cpu; + unsigned long allocated, allocated_min = UINT_MAX; + + spin_lock(&vq->irq_affinity_lock); + + best_cpu = vq->irq_effective_cpu; + if (best_cpu != -1) + per_cpu(vduse_allocated_irq, best_cpu) -= 1; + + for_each_cpu(cpu, &vq->irq_affinity) { + allocated = per_cpu(vduse_allocated_irq, cpu); + if (!cpu_online(cpu) || allocated >= allocated_min) + continue; + + best_cpu = cpu; + allocated_min = allocated; + } + vq->irq_effective_cpu = best_cpu; + per_cpu(vduse_allocated_irq, best_cpu) += 1; + + spin_unlock(&vq->irq_affinity_lock); +} + +static void vduse_vdpa_set_irq_affinity(struct vdpa_device *vdpa, + struct irq_affinity *desc) +{ + struct vduse_dev *dev = vdpa_to_vduse(vdpa); + struct irq_affinity_desc *affd = NULL; + int i; + + affd = irq_create_affinity_masks(dev->vq_num, desc); + if (!affd) + return; + + for (i = 0; i < dev->vq_num; i++) { + cpumask_copy(&dev->vqs[i]->irq_affinity, &affd[i].mask); + vduse_vq_update_effective_cpu(dev->vqs[i]); + } + kfree(affd); +} + static int vduse_vdpa_set_map(struct vdpa_device *vdpa, unsigned int asid, struct vhost_iotlb *iotlb) @@ -760,6 +807,7 @@ static const struct vdpa_config_ops vduse_vdpa_config_ops = { .get_config = vduse_vdpa_get_config, .set_config = vduse_vdpa_set_config, .get_generation = vduse_vdpa_get_generation, + .set_irq_affinity = vduse_vdpa_set_irq_affinity, .reset = vduse_vdpa_reset, .set_map = vduse_vdpa_set_map, .free = vduse_vdpa_free, @@ -1380,6 +1428,8 @@ static int vduse_dev_init_vqs(struct vduse_dev *dev, u32 vq_align, u32 vq_num) INIT_WORK(&dev->vqs[i]->kick, vduse_vq_kick_work); spin_lock_init(&dev->vqs[i]->kick_lock); spin_lock_init(&dev->vqs[i]->irq_lock); + spin_lock_init(&dev->vqs[i]->irq_affinity_lock); + cpumask_setall(&dev->vqs[i]->irq_affinity); } return 0; -- 2.20.1