From: "K. Y. Srinivasan" <kys@microsoft.com>
To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org,
devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com,
vkuznets@redhat.com, jasowang@redhat.com
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Subject: [PATCH 4/5] hv: kvp: use wrappers to propaigate state
Date: Tue, 15 Sep 2015 17:37:53 -0700 [thread overview]
Message-ID: <1442363874-22508-4-git-send-email-kys@microsoft.com> (raw)
In-Reply-To: <1442363874-22508-1-git-send-email-kys@microsoft.com>
From: Olaf Hering <olaf@aepfle.de>
The "state" is used by several threads of execution.
Propagate the state to make changes visible. Also propagate context
change in kvp_on_msg.
Signed-off-by: Olaf Hering <olaf@aepfle.de>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
---
drivers/hv/hv_kvp.c | 39 +++++++++++++++++++++------------------
1 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c
index 74c38a9..778d353 100644
--- a/drivers/hv/hv_kvp.c
+++ b/drivers/hv/hv_kvp.c
@@ -61,7 +61,7 @@
*/
static struct {
- int state; /* hvutil_device_state */
+ enum hvutil_device_state state;
int recv_len; /* number of bytes received. */
struct hv_kvp_msg *kvp_msg; /* current message */
struct vmbus_channel *recv_channel; /* chn we got the request */
@@ -74,6 +74,9 @@ static struct {
*/
static int dm_reg_value;
+#define kvp_get_state() hvutil_device_get_state(&kvp_transaction.state)
+#define kvp_set_state(s) hvutil_device_set_state(&kvp_transaction.state, s)
+
static void kvp_send_key(struct work_struct *dummy);
@@ -122,8 +125,8 @@ static void kvp_timeout_func(struct work_struct *dummy)
kvp_respond_to_host(NULL, HV_E_FAIL);
/* Transaction is finished, reset the state. */
- if (kvp_transaction.state > HVUTIL_READY)
- kvp_transaction.state = HVUTIL_READY;
+ if (kvp_get_state() > HVUTIL_READY)
+ kvp_set_state(HVUTIL_READY);
hv_poll_channel(kvp_transaction.kvp_context,
hv_kvp_onchannelcallback);
@@ -153,7 +156,7 @@ static int kvp_handle_handshake(struct hv_kvp_msg *msg)
pr_debug("KVP: userspace daemon ver. %d registered\n",
KVP_OP_REGISTER);
kvp_register(dm_reg_value);
- kvp_transaction.state = HVUTIL_READY;
+ kvp_set_state(HVUTIL_READY);
return 0;
}
@@ -177,15 +180,14 @@ static int kvp_on_msg(void *msg, int len)
* with the daemon; handle that first.
*/
- if (kvp_transaction.state < HVUTIL_READY) {
+ if (kvp_get_state() < HVUTIL_READY)
return kvp_handle_handshake(message);
- }
/* We didn't send anything to userspace so the reply is spurious */
- if (kvp_transaction.state < HVUTIL_USERSPACE_REQ)
+ if (kvp_get_state() < HVUTIL_USERSPACE_REQ)
return -EINVAL;
- kvp_transaction.state = HVUTIL_USERSPACE_RECV;
+ kvp_set_state(HVUTIL_USERSPACE_RECV);
/*
* Based on the version of the daemon, we propagate errors from the
@@ -218,7 +220,7 @@ static int kvp_on_msg(void *msg, int len)
*/
if (cancel_delayed_work_sync(&kvp_timeout_work)) {
kvp_respond_to_host(message, error);
- kvp_transaction.state = HVUTIL_READY;
+ kvp_set_state(HVUTIL_READY);
hv_poll_channel(kvp_transaction.kvp_context,
hv_kvp_onchannelcallback);
}
@@ -349,7 +351,7 @@ kvp_send_key(struct work_struct *dummy)
int rc;
/* The transaction state is wrong. */
- if (kvp_transaction.state != HVUTIL_HOSTMSG_RECEIVED)
+ if (kvp_get_state() != HVUTIL_HOSTMSG_RECEIVED)
return;
message = kzalloc(sizeof(*message), GFP_KERNEL);
@@ -442,13 +444,13 @@ kvp_send_key(struct work_struct *dummy)
break;
}
- kvp_transaction.state = HVUTIL_USERSPACE_REQ;
+ kvp_set_state(HVUTIL_USERSPACE_REQ);
rc = hvutil_transport_send(hvt, message, sizeof(*message));
if (rc) {
pr_debug("KVP: failed to communicate to the daemon: %d\n", rc);
if (cancel_delayed_work_sync(&kvp_timeout_work)) {
kvp_respond_to_host(message, HV_E_FAIL);
- kvp_transaction.state = HVUTIL_READY;
+ kvp_set_state(HVUTIL_READY);
}
}
@@ -596,12 +598,13 @@ void hv_kvp_onchannelcallback(void *context)
int util_fw_version;
int kvp_srv_version;
- if (kvp_transaction.state > HVUTIL_READY) {
+ if (kvp_get_state() > HVUTIL_READY) {
/*
* We will defer processing this callback once
* the current transaction is complete.
*/
kvp_transaction.kvp_context = context;
+ wmb();
return;
}
kvp_transaction.kvp_context = NULL;
@@ -651,12 +654,12 @@ void hv_kvp_onchannelcallback(void *context)
kvp_transaction.recv_req_id = requestid;
kvp_transaction.kvp_msg = kvp_msg;
- if (kvp_transaction.state < HVUTIL_READY) {
+ if (kvp_get_state() < HVUTIL_READY) {
/* Userspace is not registered yet */
kvp_respond_to_host(NULL, HV_E_FAIL);
return;
}
- kvp_transaction.state = HVUTIL_HOSTMSG_RECEIVED;
+ kvp_set_state(HVUTIL_HOSTMSG_RECEIVED);
/*
* Get the information from the
@@ -688,7 +691,7 @@ static void kvp_on_reset(void)
{
if (cancel_delayed_work_sync(&kvp_timeout_work))
kvp_respond_to_host(NULL, HV_E_FAIL);
- kvp_transaction.state = HVUTIL_DEVICE_INIT;
+ kvp_set_state(HVUTIL_DEVICE_INIT);
}
int
@@ -702,7 +705,7 @@ hv_kvp_init(struct hv_util_service *srv)
* Defer processing channel callbacks until the daemon
* has registered.
*/
- kvp_transaction.state = HVUTIL_DEVICE_INIT;
+ kvp_set_state(HVUTIL_DEVICE_INIT);
hvt = hvutil_transport_init(kvp_devname, CN_KVP_IDX, CN_KVP_VAL,
kvp_on_msg, kvp_on_reset);
@@ -714,7 +717,7 @@ hv_kvp_init(struct hv_util_service *srv)
void hv_kvp_deinit(void)
{
- kvp_transaction.state = HVUTIL_DEVICE_DYING;
+ kvp_set_state(HVUTIL_DEVICE_DYING);
cancel_delayed_work_sync(&kvp_timeout_work);
cancel_work_sync(&kvp_sendkey_work);
hvutil_transport_destroy(hvt);
--
1.7.4.1
next prev parent reply other threads:[~2015-09-15 23:10 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-16 0:37 [PATCH 0/5] Drivers: hv: Miscellaneous fixes K. Y. Srinivasan
2015-09-16 0:37 ` [PATCH 1/5] Drivers: hv: vmbus: fix init_vp_index() for reloading hv_netvsc K. Y. Srinivasan
2015-09-16 0:37 ` [PATCH 2/5] hv: add helpers to handle hv_util device state K. Y. Srinivasan
2015-09-21 5:25 ` Greg KH
2015-09-21 10:26 ` Olaf Hering
2015-09-21 11:25 ` Vitaly Kuznetsov
2015-09-21 12:17 ` Olaf Hering
2015-09-21 13:37 ` Vitaly Kuznetsov
2015-09-21 16:45 ` KY Srinivasan
2015-09-21 16:34 ` KY Srinivasan
2015-09-21 16:43 ` Greg KH
2015-09-21 17:00 ` KY Srinivasan
2015-09-16 0:37 ` [PATCH 3/5] hv: fcopy: use wrappers to propagate state K. Y. Srinivasan
2015-09-16 0:37 ` K. Y. Srinivasan [this message]
2015-09-21 5:26 ` [PATCH 4/5] hv: kvp: use wrappers to propaigate state Greg KH
2015-09-21 10:18 ` Olaf Hering
2015-09-21 16:31 ` KY Srinivasan
2015-09-21 16:16 ` KY Srinivasan
2015-09-16 0:37 ` [PATCH 5/5] hv: vss: use wrappers to propagate state K. Y. Srinivasan
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=1442363874-22508-4-git-send-email-kys@microsoft.com \
--to=kys@microsoft.com \
--cc=apw@canonical.com \
--cc=devel@linuxdriverproject.org \
--cc=gregkh@linuxfoundation.org \
--cc=jasowang@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=olaf@aepfle.de \
--cc=vkuznets@redhat.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.