All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dexuan Cui <decui@microsoft.com>
To: Sitsofe Wheeler <sitsofe@gmail.com>
Cc: KY Srinivasan <kys@microsoft.com>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Haiyang Zhang <haiyangz@microsoft.com>,
	"devel@linuxdriverproject.org" <devel@linuxdriverproject.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: RE: [PANIC, hyperv] BUG: unable to handle kernel paging request at ffff880077800004 (hv_ringbuffer_write)
Date: Wed, 27 Aug 2014 14:14:02 +0000	[thread overview]
Message-ID: <EE124450C0AAF944A40DD71E61F878C9965238@SINEX14MBXC419.southpacific.corp.microsoft.com> (raw)
In-Reply-To: <20140827121559.GA14286@sucs.org>

> -----Original Message-----
> From: Sitsofe Wheeler
> Sent: Wednesday, August 27, 2014 20:16 PM
> 
> > do_hypercall() fails due to HV_STATUS_INVALID_ALIGNMENT, if "the
> > specified input or output GPA pointer is not aligned to 8 bytes",
> > or, "the specified input or output parameter lists spans pages".
> > Here the 'input' can rarely across the page boundary, especially when
> > CONFIG_DEBUG_PAGEALLOC is on.
> 
> It can also be returned when "The input or output GPA pointer is not within
> the bounds of the GPA space." but I'm guessing that's not the case here?
Hi Sitsofe,
I think you're correct. 

> > I'm making a patch for this.
Please see the end of the mail for the inline patch and try it.
(the patch hasn't been rebased against KY's patchset)

> Thanks! Could these alignment problems have been the cause of all sorts
> of intermittent errors like https://lkml.org/lkml/2014/7/11/870 (which
> was caused by support being added for a bigger receive buffer)?
Probably, let's try the patch first. :-)

> > > I rebased your patch on top of the K.Y.'s "Drivers: hv: vmbus: Eliminate
> > > calls to BUG_ON()" patch set (see below). The combination no longer
> > > triggers the bug and it doesn't take too long to boot but the network
> > > interface fails to work (which I believe is .
> > the sentence is accidently trimmed here? :-)
> 
> *Cough* That bit in brackets shouldn't be there. I've been unable to
> link that stacktrace to an existing issue (I thought it might have been
> https://lkml.org/lkml/2014/8/19/227 but that seems unlikely).
I'm not 100% sure either.

> 
> > > Boot dmesg output (there's no line that mentions retries). The
> > > framebuffer window also didn't resize itself:
> > >
> > > [    7.848030] hv_vmbus: registering driver hyperv_fb
> > > [    7.859759] hyperv_fb: Unable to open vmbus channel
> > > [    7.871812] hyperv_fb: Unable to connect to VSP
> > We still see hyperv_fb can't work.
> 
> How come things didn't work even though the retries message (which is
> presumably printed if we exceed 10 attempts) was never printed?
the "10 attempts" doesn't handle HV_STATUS_INVALID_ALIGNMENT.

BTW, with the patch below, hyperv_fb can work now, BUT, *occasionally*,
storvsc_probe() -> ... -> vmbus_open() -> can fail due to
HV_STATUS_INVALID_ALIGNMENT...


diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
index 531a593..f5283a0 100644
--- a/drivers/hv/channel.c
+++ b/drivers/hv/channel.c
@@ -165,8 +165,10 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size,
 	ret = vmbus_post_msg(open_msg,
 			       sizeof(struct vmbus_channel_open_channel));
 
-	if (ret != 0)
+	if (ret != 0) {
+		err = ret;
 		goto error1;
+	}
 
 	t = wait_for_completion_timeout(&open_info->waitevent, 5*HZ);
 	if (t == 0) {
diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c
index edfc848..8366394 100644
--- a/drivers/hv/hv.c
+++ b/drivers/hv/hv.c
@@ -223,6 +223,9 @@ int hv_post_message(union hv_connection_id connection_id,
 	};
 
 	struct hv_input_post_message *aligned_msg;
+	unsigned long alighed_msg_start, alighed_msg_end;
+	bool need_free_aligned_msg = false;
+
 	u16 status;
 	unsigned long addr;
 
@@ -233,9 +236,30 @@ int hv_post_message(union hv_connection_id connection_id,
 	if (!addr)
 		return -ENOMEM;
 
+	/*
+	 * According to Hypervisor Top Level Functional Specification,
+	 * do_hypercall() fails due to HV_STATUS_INVALID_ALIGNMENT, if "the
+	 * specified input or output GPA pointer is not aligned to 8 bytes",
+	 * or, "the specified input or output parameter lists spans pages".
+	 */
 	aligned_msg = (struct hv_input_post_message *)
 			(ALIGN(addr, HV_HYPERCALL_PARAM_ALIGN));
 
+	alighed_msg_start = (unsigned long)aligned_msg;
+	alighed_msg_end = (unsigned long)&aligned_msg->payload +
+			  payload_size - 1;
+
+	if ((alighed_msg_start >> PAGE_SHIFT) !=
+	    (alighed_msg_end >> PAGE_SHIFT)) {
+		aligned_msg = (struct hv_input_post_message *)
+				__get_free_page(GFP_ATOMIC);
+		if (!aligned_msg) {
+			status = -ENOMEM;
+			goto out;
+		}
+		need_free_aligned_msg = true;
+	}
+
 	aligned_msg->connectionid = connection_id;
 	aligned_msg->message_type = message_type;
 	aligned_msg->payload_size = payload_size;
@@ -244,6 +268,11 @@ int hv_post_message(union hv_connection_id connection_id,
 	status = do_hypercall(HVCALL_POST_MESSAGE, aligned_msg, NULL)
 		& 0xFFFF;
 
+	WARN(status == HV_STATUS_INVALID_ALIGNMENT,
+		"status = %d\n", status);
+	if (need_free_aligned_msg)
+		free_page((unsigned long)aligned_msg);
+out:
 	kfree((void *)addr);
 
 	return status;


  reply	other threads:[~2014-08-27 14:15 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-20  9:26 [PANIC, hyperv] BUG: unable to handle kernel paging request at ffff880077800004 (hv_ringbuffer_write) Sitsofe Wheeler
2014-08-20 11:15 ` Dexuan Cui
2014-08-20 11:40   ` Sitsofe Wheeler
2014-08-20 13:42     ` Dexuan Cui
2014-08-25 14:02 ` Dexuan Cui
2014-08-25 17:41   ` Sitsofe Wheeler
2014-08-26 10:30     ` Dexuan Cui
2014-08-27 10:44       ` Sitsofe Wheeler
2014-08-27 11:30         ` Dexuan Cui
2014-08-27 12:15           ` Sitsofe Wheeler
2014-08-27 14:14             ` Dexuan Cui [this message]
2014-08-27 16:19               ` Sitsofe Wheeler
2014-08-27 18:45                 ` KY Srinivasan
2014-08-27 22:57                   ` Sitsofe Wheeler
2014-08-27 23:13                     ` KY Srinivasan
2014-08-28  3:21                       ` Dexuan Cui
2014-08-28  3:41                         ` KY Srinivasan
2014-08-28 12:48                         ` Sitsofe Wheeler
2014-08-29  3:39                           ` Dexuan Cui
2014-08-29  9:49                   ` Dan Carpenter
2014-08-29 10:16                     ` Dexuan Cui
2014-08-29 10:24                       ` Dan Carpenter
2014-08-29 11:20                         ` Sitsofe Wheeler
2014-08-29 14:48                           ` Dexuan Cui

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=EE124450C0AAF944A40DD71E61F878C9965238@SINEX14MBXC419.southpacific.corp.microsoft.com \
    --to=decui@microsoft.com \
    --cc=devel@linuxdriverproject.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=haiyangz@microsoft.com \
    --cc=kys@microsoft.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sitsofe@gmail.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.