Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp3743365imm; Mon, 11 Jun 2018 00:39:42 -0700 (PDT) X-Google-Smtp-Source: ADUXVKID5t0zBIb3pArjZJVa43shngdyr36lXHaUMhqgZIJLTOQR91xJQQyLo5MhsxdW/i/3gcy2 X-Received: by 2002:a17:902:7c83:: with SMTP id y3-v6mr17120938pll.51.1528702782538; Mon, 11 Jun 2018 00:39:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528702782; cv=none; d=google.com; s=arc-20160816; b=VFzltvZw9n7vF9foK0nUZWz3h13GeCdgOfQOpvt+ZZLhHE/GzdUe5eL/BvUFqwgtRa wvHBa5/YPa5YmNphtGaP1CBYuPkZcjWJ0VY29WPi9r1VpJm2Qw+Y8FGlysvxbx17DMIt t8IPVkvU0M5fIBR0OJo5VoachS5YYrDBKQN071CIKzFRghZX3VIoTpIeDoh2iCfnr/gQ QrKeJn54mhBiB7Id9TxRU51QxH0JqBXUb6tGvRJohjMUVIvHuz/7MyP10iducBI5XmOj mIOqaYXHVLcyskR+pwiRAuijZU+QXnnVhbWh+EDBK7pHH3u/1147ZW9CPfo20QCRYBbT bElw== 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 :message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=PiLu2ZxWRMZJOvBPKohYadl8DFhEGf0OmCUEg064/nM=; b=fDWLJzxPdatyIdbsNh4OZK2YKxb7K+qVctN7qi4xuaq58MFWUG7BqMvQeyqnmkEkMN bcd3IOCHkdBeElYNWifZPpPJBmRhpsqUZbBlMLP/yQyDJDD5hwZZl7LZU0vdObf1rfQb uLFCvOcRM52mk6v7BXZybRmT3pnyZKLGeqa9xPpRDCZt7rCXSFGS15BbVQf3VFTs0FCu A4TgeOkWhEQg7rAEhwZpdJeSBtoiXCOUmIrFHi0d7OBVDwfORNoY47hl6h3yuKMXu9Cc ZG2XaDowuWU8CMqOcBnzwqxEBUdCnt+bjuYp4Il42jc8nVnd8D5de/nokEiK/dxCdhIH 6mnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Os1XdAYq; 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 a22-v6si23557771plm.121.2018.06.11.00.39.27; Mon, 11 Jun 2018 00:39:42 -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=Os1XdAYq; 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 S1754028AbeFKHi7 (ORCPT + 99 others); Mon, 11 Jun 2018 03:38:59 -0400 Received: from mail-pl0-f66.google.com ([209.85.160.66]:33618 "EHLO mail-pl0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753955AbeFKHi4 (ORCPT ); Mon, 11 Jun 2018 03:38:56 -0400 Received: by mail-pl0-f66.google.com with SMTP id n10-v6so11823424plp.0; Mon, 11 Jun 2018 00:38:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=PiLu2ZxWRMZJOvBPKohYadl8DFhEGf0OmCUEg064/nM=; b=Os1XdAYqznQooSWEnZM5TeC8urtkkfH6r/5E6lgGSahXRtwAKaBEIscI9aA62PjPv4 TTZ01no7CHcyauYCtmVFjdicVswivTQCQTjPETKKlb7iunELAXntZop0T/Fdu64iXPoW TJgna+B6zycyv3D0fid1rZjM0GsDOi8JR+krLULHjkYX918nU/0EvAW+NMDXPQdfnnMK VoCzhkUXUHq7EX26PDm0G5C235mX3vLeDTCpX6AZ9IZkPLLGwq6qqTTk5TMu1Ui3Pa+T sRGOxeq1WUT1ZaniXPZJQDRjmn7+v3H+GcDX5fCuNwZlMQm2fP5cRHESepN+9iQY3KUw dbdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=PiLu2ZxWRMZJOvBPKohYadl8DFhEGf0OmCUEg064/nM=; b=Fv8DSsAXuB0zNdBRJwyqTzY0p0d+jcCJKI0lAq2kWo10xAIAh8xzYt0IElI/Yqv1Nb ErzZgLwihrLNL1mRwg4ksktAFIogltpqV3OxNrge7DQmEw0uFEjaEVoAlOMF3wiqx75P Gt/CMDSKunx9Ex35pGRUApUulnO/Axpl9dSyONSdOaJWjkm7GzTO4Y8NQ8GIDKLV3sr8 ERCYAST+H/qnNhEHFJXLkuxPFZ6cBTh4+iu6ZnJOfGmW/bhmPmQxzh8RlCOe75TSDDuk nc46Fr6IEYZJfwGhpeiE1W7Fe4iJcTD+FcBqQ1jWSb87ZIpXMQ5dRYPMJtDcuxWvwUXW U4Tw== X-Gm-Message-State: APt69E1v18hBwKPSVvhGm6L9WpOJLgVzubXyuZCp0VWDaDdDqw8zCgSc GE5IBbSFsXVjqIvpnq6UOiUcQQ== X-Received: by 2002:a17:902:8a82:: with SMTP id p2-v6mr17606187plo.244.1528702735274; Mon, 11 Jun 2018 00:38:55 -0700 (PDT) Received: from localhost.localdomain ([203.205.141.123]) by smtp.googlemail.com with ESMTPSA id c27-v6sm78323076pfl.63.2018.06.11.00.38.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 11 Jun 2018 00:38:54 -0700 (PDT) From: Wanpeng Li X-Google-Original-From: Wanpeng Li To: linux-kernel@vger.kernel.org, kvm@vger.kernel.org Cc: Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= , Peter Zijlstra , Ingo Molnar Subject: [PATCH 1/2] KVM: Fix lock holder candidate yield Date: Mon, 11 Jun 2018 15:38:49 +0800 Message-Id: <1528702730-7538-1-git-send-email-wanpengli@tencent.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Wanpeng Li After detecting pause loop which is executed by a Lock Waiter in the guest, the pCPU will be yielded to a Lock Holder candidate, the Lock Holder candidate may have its own task affinity constrain, however, current yield logic yield to the Lock Holder condidate unconditionally w/o checking the affinity constrain and set the task to the next buddy of cfs, this will break the scheduler. This patch fixes it by skipping the candidate vCPU if the current pCPU doesn't meat the affinity constrain. Cc: Paolo Bonzini Cc: Radim Krčmář Cc: Peter Zijlstra Cc: Ingo Molnar Signed-off-by: Wanpeng Li --- virt/kvm/kvm_main.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index aa7da1d8e..ccf8907 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2239,17 +2239,40 @@ void kvm_vcpu_kick(struct kvm_vcpu *vcpu) EXPORT_SYMBOL_GPL(kvm_vcpu_kick); #endif /* !CONFIG_S390 */ -int kvm_vcpu_yield_to(struct kvm_vcpu *target) +struct task_struct *vcpu_to_task(struct kvm_vcpu *target) { struct pid *pid; struct task_struct *task = NULL; - int ret = 0; rcu_read_lock(); pid = rcu_dereference(target->pid); if (pid) task = get_pid_task(pid, PIDTYPE_PID); rcu_read_unlock(); + return task; +} + +bool kvm_vcpu_allow_yield(struct kvm_vcpu *target) +{ + struct task_struct *task = NULL; + bool ret = false; + + task = vcpu_to_task(target); + if (!task) + return ret; + if (cpumask_test_cpu(raw_smp_processor_id(), &task->cpus_allowed)) + ret = true; + put_task_struct(task); + + return ret; +} + +int kvm_vcpu_yield_to(struct kvm_vcpu *target) +{ + struct task_struct *task = NULL; + int ret = 0; + + task = vcpu_to_task(target); if (!task) return ret; ret = yield_to(task, 1); @@ -2333,6 +2356,8 @@ void kvm_vcpu_on_spin(struct kvm_vcpu *me, bool yield_to_kernel_mode) continue; if (!kvm_vcpu_eligible_for_directed_yield(vcpu)) continue; + if (!kvm_vcpu_allow_yield(vcpu)) + continue; yielded = kvm_vcpu_yield_to(vcpu); if (yielded > 0) { -- 2.7.4