Received: by 2002:ac0:a581:0:0:0:0:0 with SMTP id m1-v6csp3790933imm; Mon, 2 Jul 2018 05:45:50 -0700 (PDT) X-Google-Smtp-Source: ADUXVKJXV9usmyQ2H9uMVnjCmqGdwu8ieI7+K4uL4ppSxHQhgqB81LzwyDH9cOhREWcOIW6By1Ur X-Received: by 2002:a17:902:22:: with SMTP id 31-v6mr26054193pla.332.1530535550396; Mon, 02 Jul 2018 05:45:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530535550; cv=none; d=google.com; s=arc-20160816; b=Y/7+QYiD9NW+LazHcRcr1eR4VtOh0gky12btQHkk13EAkZdeeCqr7yzMeIkas+pEt8 y5m6Msm8Hip6+nMACG2DtXt6SkpYHOffYA4fwsGm2UUc0F7mc6wJLTiuaLHTxXYAHLwH 50xbisTlSRgGA+OTHxc2pyHd33QZKI/lazg1LQkAYAH7M5/lyoGHxPDmxKmyW3oU/UOo vWvB66iiGNXnzq0Gy8SOHwYh8JW+AIY0UOwf4Oq6jSpwQr6N/Y7pROjloXZZ1KvsAK9o 0nMXE2wsqfyG/dnRkNe4PRSnMT41//YghtGTA+0GjA/cZJwSnIC6jAQ/wSYCNE0IiDt7 pMAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature :arc-authentication-results; bh=t7GGwVQu73IvJg3JvDEzagTHBWvRnCgzrqAshi/n6wg=; b=bWypfHLnzI6sSNgpj/f7cectJ/SjDROlMTt6QiT7tlpAVgp0OIZ9I9B5JzB548x8r9 43AY7THslfBGsiniUaPAjaFxy/XYSaNODAWKrLykD0aHEdyXl8H9wn3qhA6jpUpFEEiu XMEE+mPptm/Zi9QdzWeyJe4GYDfzGgWqjmP5gmLECv+ZmPexlkwaWMKgHpRn4hufHUf6 KRde1jVAjsZk3wlLDX12TgUnjPuP1pwXOQQmFxNUrpnnzEKv2Mtwn/XN7KlNsdproJ/9 RglcbBVM9U8WD723y7seCeoiVfxh435Y3S0KcU7VmU7QYifF4XaklWkZ2LkgPWSu9hUP 6q/Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=JrfZe9SS; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id z1-v6si15926717plo.516.2018.07.02.05.45.35; Mon, 02 Jul 2018 05:45:50 -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; dkim=pass header.i=@gmail.com header.s=20161025 header.b=JrfZe9SS; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754635AbeGBMIw (ORCPT + 99 others); Mon, 2 Jul 2018 08:08:52 -0400 Received: from mail-oi0-f68.google.com ([209.85.218.68]:43275 "EHLO mail-oi0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753212AbeGBMIu (ORCPT ); Mon, 2 Jul 2018 08:08:50 -0400 Received: by mail-oi0-f68.google.com with SMTP id b15-v6so1710730oib.10; Mon, 02 Jul 2018 05:08:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=t7GGwVQu73IvJg3JvDEzagTHBWvRnCgzrqAshi/n6wg=; b=JrfZe9SSnF+RA5V+/w5M34NSUyJqOiokZkDcowNBejwNowFnfksxt1XjFh1rx8f4ee RbT4QHL/2d/brjE7I0EtS77nA2kYU7aJeOWuCmIr30n+8oyQCvnIlGAQmeCqzZti/6UV zZGvy4KYEqgLI5R2Aftl9X3P/1ObTG2XYIukWQbNow84ukPZlqIgJ3N9RJk+2iaRAYwq dbiqpo2PFA8fKxfv5C52xPlfV7mKgigzjxjO/hQu1iaCy2MB3anmPIjNsb0jOg6PZ8B1 9NCTBTEGvXRPt4KoRPE40UHYnSN20cbEKms/8jPWZz7ylL49UzhWif4MMhc/Pj25G+tM 4mDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=t7GGwVQu73IvJg3JvDEzagTHBWvRnCgzrqAshi/n6wg=; b=kbjARKy3q9kcYc4jTPnFm5bnyrUe4qdHcCYsMwHNOV2sFPCcHkzdxGOa+RYiOUxS0i OPhiyevhJHXrHcKjQFMktzNUSumcFxdat8+d7MUwRpPLcY9Q2ASItg17oGBH3E94q8I+ aCA3gCSvHiHlrvUcngMp29o9fy+SY6uHXSp0mWImdmoxH5/RH4n2WsEOuLWMLDquFq4E pl0nP4+L2BkZLb+rYUJYpFS7AghxBR9bo6Lkl20MjAd08ziDR8QLxsQR4xWaxD9dwEgU oYUYtKWbNQ1m1jdAZpADn4N3qmGNY9PJYpHl7IhkwdFS6Ls3sgbfiaHbrTImWMnUk/MZ i6yg== X-Gm-Message-State: APt69E0gX/Sjqli7heYsxkFvn6kWTmDs8pz9aDiZcstTHXOjcKW/Oa0Y TZ4Gmqtwgz3d0ZoekQNAqJ3LO/lZUh4Sr6zQ7dg= X-Received: by 2002:aca:68a2:: with SMTP id o34-v6mr14560863oik.267.1530533330360; Mon, 02 Jul 2018 05:08:50 -0700 (PDT) MIME-Version: 1.0 References: <1530526462-920-1-git-send-email-wanpengli@tencent.com> <1530526462-920-2-git-send-email-wanpengli@tencent.com> <9e886415-2b68-ac1d-aadb-b44695ab0b21@redhat.com> In-Reply-To: <9e886415-2b68-ac1d-aadb-b44695ab0b21@redhat.com> From: Wanpeng Li Date: Mon, 2 Jul 2018 20:08:40 +0800 Message-ID: Subject: Re: [PATCH v2 1/2] KVM: X86: Implement PV IPI in linux guest To: Paolo Bonzini Cc: LKML , kvm , Radim Krcmar , Vitaly Kuznetsov Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 2 Jul 2018 at 19:32, Paolo Bonzini wrote: > > On 02/07/2018 12:14, Wanpeng Li wrote: > > + unsigned long flags, ipi_bitmap_low = 0, ipi_bitmap_high = 0, icr = 0; > > + int cpu, apic_id, ret = 1; > > + > > + if (cpumask_empty(mask)) > > + return true; > > + > > + local_irq_save(flags); > > + > > + for_each_cpu(cpu, mask) { > > + apic_id = per_cpu(x86_cpu_to_apicid, cpu); > > + if (apic_id < BITS_PER_LONG) > > + __set_bit(apic_id, &ipi_bitmap_low); > > + else if (apic_id < 2 * BITS_PER_LONG) > > + __set_bit(apic_id - BITS_PER_LONG, &ipi_bitmap_high); > > + else > > + goto ipi_mask_done; > > + } > > CPU masks are themselves bitmaps made of longs, so you should be able to > avoid the loop here. As we discuss offline, loop is needed since I need to convert processor id which is allocated by OS to apic id. > > > +static void kvm_send_ipi_mask(const struct cpumask *mask, int vector) > > +{ > > + if (!__send_ipi_mask(mask, vector)) > > + orig_apic.send_IPI_mask(mask, vector); > > +} > > + > > +static void kvm_send_ipi_mask_allbutself(const struct cpumask *mask, int vector) > > +{ > > + unsigned int this_cpu = smp_processor_id(); > > + struct cpumask new_mask; > > + const struct cpumask *local_mask; > > + > > + cpumask_copy(&new_mask, mask); > > + cpumask_clear_cpu(this_cpu, &new_mask); > > + local_mask = &new_mask; > > + if (!__send_ipi_mask(local_mask, vector)) > > + orig_apic.send_IPI_mask_allbutself(mask, vector); > > +} > > Likewise, here it should be possible to check the highest bit in the > mask before copying it. __send_ipi_mask() has already handled sparse APIC ID and > 128 APID ID scenarios. Regards, Wanpeng Li