From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932732AbbDIIjM (ORCPT ); Thu, 9 Apr 2015 04:39:12 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33205 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932476AbbDIIjG (ORCPT ); Thu, 9 Apr 2015 04:39:06 -0400 From: Vitaly Kuznetsov To: "K. Y. Srinivasan" , devel@linuxdriverproject.org Cc: Haiyang Zhang , linux-kernel@vger.kernel.org, Dexuan Cui , Radim Krcmar , Greg Kroah-Hartman , linux-api@vger.kernel.org Subject: [PATCH v3 05/21] Drivers: hv: vss: process deferred messages when we complete the transaction Date: Thu, 9 Apr 2015 10:38:34 +0200 Message-Id: <1428568730-6030-6-git-send-email-vkuznets@redhat.com> In-Reply-To: <1428568730-6030-1-git-send-email-vkuznets@redhat.com> References: <1428568730-6030-1-git-send-email-vkuznets@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In theory, the host is not supposed to issue any requests before be reply to the previous one. In KVP we, however, support the following scenarios: 1) A message was received before userspace daemon registered; 2) A message was received while the previous one is still being processed. In VSS we support only the former. Add support for the later, use hv_poll_channel() to do the job. Signed-off-by: Vitaly Kuznetsov --- drivers/hv/hv_snapshot.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/hv/hv_snapshot.c b/drivers/hv/hv_snapshot.c index c1a3604..4bb9b1c 100644 --- a/drivers/hv/hv_snapshot.c +++ b/drivers/hv/hv_snapshot.c @@ -47,6 +47,7 @@ static struct { struct vmbus_channel *recv_channel; /* chn we got the request */ u64 recv_req_id; /* request ID. */ struct hv_vss_msg *msg; /* current message */ + void *vss_context; /* for the channel callback */ } vss_transaction; @@ -73,6 +74,9 @@ static void vss_timeout_func(struct work_struct *dummy) */ pr_warn("VSS: timeout waiting for daemon to reply\n"); vss_respond_to_host(HV_E_FAIL); + + hv_poll_channel(vss_transaction.vss_context, + hv_vss_onchannelcallback); } static void @@ -85,13 +89,12 @@ vss_cn_callback(struct cn_msg *msg, struct netlink_skb_parms *nsp) if (vss_msg->vss_hdr.operation == VSS_OP_REGISTER) { pr_info("VSS daemon registered\n"); vss_transaction.active = false; - if (vss_transaction.recv_channel != NULL) - hv_vss_onchannelcallback(vss_transaction.recv_channel); - return; - } if (cancel_delayed_work_sync(&vss_timeout_work)) vss_respond_to_host(vss_msg->error); + + hv_poll_channel(vss_transaction.vss_context, + hv_vss_onchannelcallback); } @@ -198,9 +201,10 @@ void hv_vss_onchannelcallback(void *context) * We will defer processing this callback once * the current transaction is complete. */ - vss_transaction.recv_channel = channel; + vss_transaction.vss_context = context; return; } + vss_transaction.vss_context = NULL; vmbus_recvpacket(channel, recv_buffer, PAGE_SIZE * 2, &recvlen, &requestid); -- 1.9.3