All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Borntraeger <borntraeger@de.ibm.com>
To: Avi Kivity <avi@redhat.com>, Marcelo Tossati <mtosatti@redhat.com>
Cc: Carsten Otte <cotte@de.ibm.com>, Alexander Graf <agraf@suse.de>,
	Jens Freimann <jfrei@linux.vnet.ibm.com>,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Heiko Carstens <heiko.carstens@de.ibm.com>,
	Martin Schwidefsky <schwidefsky@de.ibm.com>,
	Heinz Graalfs <graalfs@linux.vnet.ibm.com>,
	KVM <kvm@vger.kernel.org>, Konstantin Weitz <WEITZKON@de.ibm.com>,
	Christian Borntraeger <borntraeger@de.ibm.com>
Subject: [PATCH 1/3v2] kvm-s390: Implement the directed yield (diag 9c) hypervisor call for KVM
Date: Tue, 24 Apr 2012 14:55:14 +0200	[thread overview]
Message-ID: <1335272114-64505-1-git-send-email-borntraeger@de.ibm.com> (raw)
In-Reply-To: <4F96A021.4000704@de.ibm.com>

From: Konstantin Weitz <WEITZKON@de.ibm.com>

This patch implements the directed yield hypercall found on other
System z hypervisors. It delegates execution time to the virtual cpu
specified in the instruction's parameter.

Useful to avoid long spinlock waits in the guest.

Signed-off-by: Konstantin Weitz <WEITZKON@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
---
 arch/s390/include/asm/kvm_host.h |    1 +
 arch/s390/kvm/diag.c             |   41 ++++++++++++++++++++++++++++++++++++++
 arch/s390/kvm/kvm-s390.c         |    1 +
 3 files changed, 43 insertions(+)

diff --git a/arch/s390/include/asm/kvm_host.h b/arch/s390/include/asm/kvm_host.h
index 7343872..dd17537 100644
--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -148,6 +148,7 @@ struct kvm_vcpu_stat {
 	u32 instruction_sigp_restart;
 	u32 diagnose_10;
 	u32 diagnose_44;
+	u32 diagnose_9c;
 };
 
 struct kvm_s390_io_info {
diff --git a/arch/s390/kvm/diag.c b/arch/s390/kvm/diag.c
index a353f0e..022962b 100644
--- a/arch/s390/kvm/diag.c
+++ b/arch/s390/kvm/diag.c
@@ -53,6 +53,45 @@ static int __diag_time_slice_end(struct kvm_vcpu *vcpu)
 	return 0;
 }
 
+static int __diag_time_slice_end_directed(struct kvm_vcpu *vcpu)
+{
+	struct kvm *kvm = vcpu->kvm;
+	struct kvm_vcpu *tcpu;
+	int tid;
+	int i;
+
+	tid = vcpu->run->s.regs.gprs[(vcpu->arch.sie_block->ipa & 0xf0) >> 4];
+	vcpu->stat.diagnose_9c++;
+	VCPU_EVENT(vcpu, 5, "diag time slice end directed to %d", tid);
+
+	if (tid == vcpu->vcpu_id)
+		return 0;
+
+	kvm_for_each_vcpu(i, tcpu, kvm) {
+		if (tcpu->vcpu_id == tid) {
+			struct task_struct *task = NULL;
+			struct pid *pid;
+			rcu_read_lock();
+			pid = rcu_dereference(tcpu->pid);
+			if (pid)
+				task = get_pid_task(tcpu->pid, PIDTYPE_PID);
+			rcu_read_unlock();
+			if (!task)
+				break;
+			if (task->flags & PF_VCPU) {
+				put_task_struct(task);
+				break;
+			}
+			if (yield_to(task, 1)) {
+				put_task_struct(task);
+				return 0;
+			}
+			put_task_struct(task);
+		}
+	}
+	return 0;
+}
+
 static int __diag_ipl_functions(struct kvm_vcpu *vcpu)
 {
 	unsigned int reg = vcpu->arch.sie_block->ipa & 0xf;
@@ -89,6 +128,8 @@ int kvm_s390_handle_diag(struct kvm_vcpu *vcpu)
 		return diag_release_pages(vcpu);
 	case 0x44:
 		return __diag_time_slice_end(vcpu);
+	case 0x9c:
+		return __diag_time_slice_end_directed(vcpu);
 	case 0x308:
 		return __diag_ipl_functions(vcpu);
 	default:
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
index d30c835..fd98914 100644
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -74,6 +74,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = {
 	{ "instruction_sigp_restart", VCPU_STAT(instruction_sigp_restart) },
 	{ "diagnose_10", VCPU_STAT(diagnose_10) },
 	{ "diagnose_44", VCPU_STAT(diagnose_44) },
+	{ "diagnose_9c", VCPU_STAT(diagnose_9c) },
 	{ NULL }
 };
 
-- 
1.7.9.6


  reply	other threads:[~2012-04-24 12:55 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-24  7:24 [PATCH 0/3] Fixes and feature for kvm-s390 Christian Borntraeger
2012-04-24  7:24 ` [PATCH 1/3] kvm-s390: Implement the directed yield (diag 9c) hypervisor call for KVM Christian Borntraeger
2012-04-24 12:04   ` Avi Kivity
2012-04-24 12:44     ` Christian Borntraeger
2012-04-24 12:55       ` Christian Borntraeger [this message]
2012-04-24 13:06         ` [PATCH 1/3v2] " Avi Kivity
2012-04-24 15:47           ` Christian Borntraeger
2012-04-24 16:15             ` Avi Kivity
2012-04-24 16:21               ` Christian Borntraeger
2012-04-24 16:22                 ` Avi Kivity
2012-04-25 13:30                   ` [PATCH 0/2] rework kvm_vcpu_on_spin Christian Borntraeger
2012-04-25 13:30                     ` [PATCH 1/2] kvm-s390: Implement the directed yield (diag 9c) hypervisor call for KVM Christian Borntraeger
2012-04-26 12:06                       ` Alexander Graf
2012-04-26 12:19                         ` Christian Borntraeger
2012-04-26 12:26                           ` Alexander Graf
2012-04-25 13:30                     ` [PATCH 2/2] kvm-s390: use kvm_vcpu_on_spin for diag 0x44 Christian Borntraeger
2012-04-29 11:10                     ` [PATCH 0/2] rework kvm_vcpu_on_spin Avi Kivity
2012-06-06 12:55     ` trace points and ABI Christian Borntraeger
2012-06-06 13:12       ` Avi Kivity
2012-04-24  7:24 ` [PATCH 2/3] kvm-s390: Handle sckpf instruction Christian Borntraeger
2012-04-24  7:24 ` [PATCH 3/3] kvm-s390: implement KVM_CAP_MAX_VCPUS Christian Borntraeger
2012-04-24 12:06   ` Avi Kivity
2012-04-24 12:47     ` Christian Borntraeger
2012-04-24 13:01       ` Avi Kivity
2012-05-01  0:51         ` Marcelo Tosatti
2012-05-01  1:00           ` Marcelo Tosatti
2012-05-02  8:50             ` [PATCH 0/1] Updated Patch for NR/MAX VCPU on s390 Christian Borntraeger
2012-05-02  8:50               ` [PATCH 1/1] kvm-s390x: implement KVM_CAP_NR/MAX_VCPUS Christian Borntraeger
2012-05-02 21:36                 ` Marcelo Tosatti

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1335272114-64505-1-git-send-email-borntraeger@de.ibm.com \
    --to=borntraeger@de.ibm.com \
    --cc=WEITZKON@de.ibm.com \
    --cc=agraf@suse.de \
    --cc=avi@redhat.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=cotte@de.ibm.com \
    --cc=graalfs@linux.vnet.ibm.com \
    --cc=heiko.carstens@de.ibm.com \
    --cc=jfrei@linux.vnet.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=schwidefsky@de.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.