mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: torvalds@linux-foundation.org, akpm@linux-foundation.org,
	alan@lxorguk.ukuu.org.uk,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Carsten Otte <cotte@de.ibm.com>, Avi Kivity <avi@redhat.com>
Subject: [07/53] KVM: s390: Fix RUNNING flag misinterpretation
Date: Tue, 22 Nov 2011 16:25:07 -0800	[thread overview]
Message-ID: <20111123002553.539620788@clark.kroah.org> (raw)
In-Reply-To: <20111123002601.GA14467@kroah.com>

3.1-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Cornelia Huck <cornelia.huck@de.ibm.com>

commit 9e6dabeffd1d0ec2aa19aa076c4886067238d442 upstream.

CPUSTAT_RUNNING was implemented signifying that a vcpu is not stopped.
This is not, however, what the architecture says: RUNNING should be
set when the host is acting on the behalf of the guest operating
system.

CPUSTAT_RUNNING has been changed to be set in kvm_arch_vcpu_load()
and to be unset in kvm_arch_vcpu_put().

For signifying stopped state of a vcpu, a host-controlled bit has
been used and is set/unset basically on the reverse as the old
CPUSTAT_RUNNING bit (including pushing it down into stop handling
proper in handle_stop()).

Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
 arch/s390/include/asm/kvm_host.h |    2 +-
 arch/s390/kvm/diag.c             |    2 +-
 arch/s390/kvm/intercept.c        |    3 ++-
 arch/s390/kvm/interrupt.c        |    1 +
 arch/s390/kvm/kvm-s390.c         |   10 +++++++---
 arch/s390/kvm/sigp.c             |    6 +++---
 6 files changed, 15 insertions(+), 9 deletions(-)

--- a/arch/s390/include/asm/kvm_host.h
+++ b/arch/s390/include/asm/kvm_host.h
@@ -47,7 +47,7 @@ struct sca_block {
 #define KVM_HPAGE_MASK(x)	(~(KVM_HPAGE_SIZE(x) - 1))
 #define KVM_PAGES_PER_HPAGE(x)	(KVM_HPAGE_SIZE(x) / PAGE_SIZE)
 
-#define CPUSTAT_HOST       0x80000000
+#define CPUSTAT_STOPPED    0x80000000
 #define CPUSTAT_WAIT       0x10000000
 #define CPUSTAT_ECALL_PEND 0x08000000
 #define CPUSTAT_STOP_INT   0x04000000
--- a/arch/s390/kvm/diag.c
+++ b/arch/s390/kvm/diag.c
@@ -42,7 +42,7 @@ static int __diag_ipl_functions(struct k
 		return -EOPNOTSUPP;
 	}
 
-	atomic_clear_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
+	atomic_set_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
 	vcpu->run->s390_reset_flags |= KVM_S390_RESET_SUBSYSTEM;
 	vcpu->run->s390_reset_flags |= KVM_S390_RESET_IPL;
 	vcpu->run->s390_reset_flags |= KVM_S390_RESET_CPU_INIT;
--- a/arch/s390/kvm/intercept.c
+++ b/arch/s390/kvm/intercept.c
@@ -132,7 +132,6 @@ static int handle_stop(struct kvm_vcpu *
 	int rc = 0;
 
 	vcpu->stat.exit_stop_request++;
-	atomic_clear_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
 	spin_lock_bh(&vcpu->arch.local_int.lock);
 	if (vcpu->arch.local_int.action_bits & ACTION_STORE_ON_STOP) {
 		vcpu->arch.local_int.action_bits &= ~ACTION_STORE_ON_STOP;
@@ -149,6 +148,8 @@ static int handle_stop(struct kvm_vcpu *
 	}
 
 	if (vcpu->arch.local_int.action_bits & ACTION_STOP_ON_STOP) {
+		atomic_set_mask(CPUSTAT_STOPPED,
+				&vcpu->arch.sie_block->cpuflags);
 		vcpu->arch.local_int.action_bits &= ~ACTION_STOP_ON_STOP;
 		VCPU_EVENT(vcpu, 3, "%s", "cpu stopped");
 		rc = -EOPNOTSUPP;
--- a/arch/s390/kvm/interrupt.c
+++ b/arch/s390/kvm/interrupt.c
@@ -224,6 +224,7 @@ static void __do_deliver_interrupt(struc
 			offsetof(struct _lowcore, restart_psw), sizeof(psw_t));
 		if (rc == -EFAULT)
 			exception = 1;
+		atomic_clear_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
 		break;
 
 	case KVM_S390_PROGRAM_INT:
--- a/arch/s390/kvm/kvm-s390.c
+++ b/arch/s390/kvm/kvm-s390.c
@@ -265,10 +265,12 @@ void kvm_arch_vcpu_load(struct kvm_vcpu
 	restore_fp_regs(&vcpu->arch.guest_fpregs);
 	restore_access_regs(vcpu->arch.guest_acrs);
 	gmap_enable(vcpu->arch.gmap);
+	atomic_set_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
 }
 
 void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
 {
+	atomic_clear_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
 	gmap_disable(vcpu->arch.gmap);
 	save_fp_regs(&vcpu->arch.guest_fpregs);
 	save_access_regs(vcpu->arch.guest_acrs);
@@ -296,7 +298,9 @@ static void kvm_s390_vcpu_initial_reset(
 
 int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu)
 {
-	atomic_set(&vcpu->arch.sie_block->cpuflags, CPUSTAT_ZARCH | CPUSTAT_SM);
+	atomic_set(&vcpu->arch.sie_block->cpuflags, CPUSTAT_ZARCH |
+						    CPUSTAT_SM |
+						    CPUSTAT_STOPPED);
 	vcpu->arch.sie_block->ecb   = 6;
 	vcpu->arch.sie_block->eca   = 0xC1002001U;
 	vcpu->arch.sie_block->fac   = (int) (long) facilities;
@@ -421,7 +425,7 @@ static int kvm_arch_vcpu_ioctl_set_initi
 {
 	int rc = 0;
 
-	if (atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_RUNNING)
+	if (!(atomic_read(&vcpu->arch.sie_block->cpuflags) & CPUSTAT_STOPPED))
 		rc = -EBUSY;
 	else {
 		vcpu->run->psw_mask = psw.mask;
@@ -494,7 +498,7 @@ rerun_vcpu:
 	if (vcpu->sigset_active)
 		sigprocmask(SIG_SETMASK, &vcpu->sigset, &sigsaved);
 
-	atomic_set_mask(CPUSTAT_RUNNING, &vcpu->arch.sie_block->cpuflags);
+	atomic_clear_mask(CPUSTAT_STOPPED, &vcpu->arch.sie_block->cpuflags);
 
 	BUG_ON(vcpu->kvm->arch.float_int.local_int[vcpu->vcpu_id] == NULL);
 
--- a/arch/s390/kvm/sigp.c
+++ b/arch/s390/kvm/sigp.c
@@ -57,8 +57,8 @@ static int __sigp_sense(struct kvm_vcpu
 	spin_lock(&fi->lock);
 	if (fi->local_int[cpu_addr] == NULL)
 		rc = 3; /* not operational */
-	else if (atomic_read(fi->local_int[cpu_addr]->cpuflags)
-		 & CPUSTAT_RUNNING) {
+	else if (!(atomic_read(fi->local_int[cpu_addr]->cpuflags)
+		  & CPUSTAT_STOPPED)) {
 		*reg &= 0xffffffff00000000UL;
 		rc = 1; /* status stored */
 	} else {
@@ -212,7 +212,7 @@ static int __sigp_set_prefix(struct kvm_
 
 	spin_lock_bh(&li->lock);
 	/* cpu must be in stopped state */
-	if (atomic_read(li->cpuflags) & CPUSTAT_RUNNING) {
+	if (!(atomic_read(li->cpuflags) & CPUSTAT_STOPPED)) {
 		rc = 1; /* incorrect state */
 		*reg &= SIGP_STAT_INCORRECT_STATE;
 		kfree(inti);



  parent reply	other threads:[~2011-11-23  0:35 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-23  0:26 [00/53] 3.1.3-stable review Greg KH
2011-11-23  0:25 ` [01/53] genirq: Fix irqfixup, irqpoll regression Greg KH
2011-11-23  0:25 ` [02/53] ALSA: hda - Fix the connection selection of ADCs on Cirrus codecs Greg KH
2011-11-23  0:25 ` [03/53] [SCSI] fix WARNING: at drivers/scsi/scsi_lib.c:1704 Greg KH
2011-11-23  0:25 ` [04/53] [SCSI] hpsa: Disable ASPM Greg KH
2011-11-23  0:25 ` [05/53] [SCSI] aacraid: controller hangs if kernel uses non-default ASPM policy Greg KH
2011-11-23  0:25 ` [06/53] [media] saa7164: Add support for another HVR2200 hardware revision Greg KH
2011-11-23  0:25 ` Greg KH [this message]
2011-11-23  0:25 ` [08/53] ARM: 7150/1: Allow kernel unaligned accesses on ARMv6+ Greg KH
2011-11-23  0:25 ` [09/53] Net, libertas: Resolve memory leak in if_spi_host_to_card() Greg KH
2011-11-23  0:25 ` [10/53] rt2x00: Fix sleep-while-atomic bug in powersaving code Greg KH
2011-11-23  0:25 ` [11/53] mac80211: fix NULL dereference in radiotap code Greg KH
2011-11-23  0:25 ` [12/53] mac80211: fix bug in ieee80211_build_probe_req Greg KH
2011-11-23  0:25 ` [13/53] nl80211: fix HT capability attribute validation Greg KH
2011-11-23  0:25 ` [14/53] cfg80211: fix bug on regulatory core exit on access to last_request Greg KH
2011-11-23  0:25 ` [15/53] ip6_tunnel: copy parms.name after register_netdevice Greg KH
2011-11-23  0:25 ` [16/53] PM / driver core: disable devices runtime PM during shutdown Greg KH
2011-11-23  0:25 ` [17/53] pch_phub: Support new device LAPIS Semiconductor ML7831 IOH Greg KH
2011-11-23  0:25 ` [18/53] pch_phub: Fix MAC address writing issue for LAPIS ML7831 Greg KH
2011-11-23  0:25 ` [19/53] pch_uart: Fix hw-flow control issue Greg KH
2011-11-23  0:25 ` [20/53] pch_uart: Fix DMA resource leak issue Greg KH
2011-11-23  0:25 ` [21/53] pch_uart: Support new device LAPIS Semiconductor ML7831 IOH Greg KH
2011-11-23  0:25 ` [22/53] tty: hvc_dcc: Fix duplicate character inputs Greg KH
2011-11-23  0:25 ` [23/53] TTY: ldisc, allow waiting for ldisc arbitrarily long Greg KH
2011-11-23  0:25 ` [24/53] TTY: ldisc, move wait idle to caller Greg KH
2011-11-23  0:25 ` [25/53] TTY: ldisc, wait for ldisc infinitely in hangup Greg KH
2011-11-23  0:25 ` [26/53] nfs: when attempting to open a directory, fall back on normal lookup (try #5) Greg KH
2011-11-23  0:25 ` [27/53] ALSA: hda - fix ELD memory leak Greg KH
2011-11-23  0:25 ` [28/53] pcie-gadget-spear: Add "platform:" prefix for platform modalias Greg KH
2011-11-23  0:25 ` [29/53] drivers/base/node.c: fix compilation error with older versions of gcc Greg KH
2011-11-23  0:25 ` [30/53] xhci: Set slot and ep0 flags for address command Greg KH
2011-11-23  0:25 ` [31/53] usb, xhci: Clear warm reset change event during init Greg KH
2011-11-23  0:25 ` [32/53] usb, xhci: fix lockdep warning on endpoint timeout Greg KH
2011-11-23  0:25 ` [33/53] USB: XHCI: resume root hubs when the controller resumes Greg KH
2011-11-23  0:25 ` [34/53] USB: option: release new PID for ZTE 3G modem Greg KH
2011-11-23  0:25 ` [35/53] USB: option: add PID of Huawei E173s " Greg KH
2011-11-23  0:25 ` [36/53] USB: serial: pl2303: rm duplicate id Greg KH
2011-11-23  0:25 ` [37/53] USB: pch_udc: Support new device LAPIS Semiconductor ML7831 IOH Greg KH
2011-11-23  0:25 ` [38/53] USB: cdc-acm: Fix disconnect() vs close() race Greg KH
2011-11-23  0:25 ` [39/53] USB: workaround for bug in old version of GCC Greg KH
2011-11-23  0:25 ` [40/53] USB: ark3116 initialisation fix Greg KH
2011-11-23  0:25 ` [41/53] USB: Fix Corruption issue in USB ftdi driver ftdi_sio.c Greg KH
2011-11-23  0:25 ` [42/53] usb-storage: Accept 8020i-protocol commands longer than 12 bytes Greg KH
2011-11-23  0:25 ` [43/53] USB: EHCI: fix HUB TT scheduling issue with iso transfer Greg KH
2011-11-23  0:25 ` [44/53] USB: add quirk for Logitech C600 web cam Greg KH
2011-11-23  0:25 ` [45/53] USB: quirks: adding more quirky webcams to avoid squeaky audio Greg KH
2011-11-23  0:25 ` [46/53] drm/i915: fix IVB cursor support Greg KH
2011-11-23  0:25 ` [47/53] drm/i915: always set FDI composite sync bit Greg KH
2011-11-23  0:25 ` [48/53] batman-adv: fix tt_local_reset_flags() function Greg KH
2011-11-23  0:25 ` [49/53] batman-adv: correctly set the data field in the TT_REPONSE packet Greg KH
2011-11-23  0:25 ` [50/53] batman-adv: remove references for global tt entries Greg KH
2011-11-23  0:25 ` [51/53] batman-adv: add sanity check when removing global tts Greg KH
2011-11-23  0:25 ` [52/53] batman-adv: unify hash_entry field position in tt_local/global_entry Greg KH
2011-11-23  0:25 ` [53/53] vmscan: fix shrinker callback bug in fs/super.c Greg KH

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=20111123002553.539620788@clark.kroah.org \
    --to=gregkh@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=avi@redhat.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=cotte@de.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®