From: K. Y. Srinivasan
Enhance the rescind callback functionality by permitting the passing of an
opaque
pointer. This functionality will be used by vmbus device drivers to implement
rescind related cleanup more efficiently.
Signed-off-by: K. Y. Srinivasan
---
drivers/hv/channel_mgmt.c | 11 +++
include/linux/hyperv.h|7 ---
2 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
index f9c5827..d83c1ac 100644
--- a/drivers/hv/channel_mgmt.c
+++ b/drivers/hv/channel_mgmt.c
@@ -825,8 +825,10 @@ static void vmbus_onoffer_rescind(struct
vmbus_channel_message_header *hdr)
if (channel->device_obj) {
if (channel->chn_rescind_callback) {
- channel->chn_rescind_callback(channel);
- goto out;
+ channel->chn_rescind_callback(channel,
+ channel->rescind_arg);
+ if (is_hvsock_channel(channel))
+ goto out;
}
/*
* We will have to unregister this device from the
@@ -1215,9 +1217,10 @@ bool vmbus_are_subchannels_present(struct vmbus_channel
*primary)
}
EXPORT_SYMBOL_GPL(vmbus_are_subchannels_present);
-void vmbus_set_chn_rescind_callback(struct vmbus_channel *channel,
- void (*chn_rescind_cb)(struct vmbus_channel *))
+void vmbus_set_chn_rescind_callback(struct vmbus_channel *channel, void *arg,
+ void (*chn_rescind_cb)(struct vmbus_channel *, void *))
{
channel->chn_rescind_callback = chn_rescind_cb;
+ channel->rescind_arg = arg;
}
EXPORT_SYMBOL_GPL(vmbus_set_chn_rescind_callback);
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index 35053f9..a9a0ce4 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -800,7 +800,8 @@ struct vmbus_channel {
* Channel rescind callback. Some channels (the hvsock ones), need to
* register a callback which is invoked in vmbus_onoffer_rescind().
*/
- void (*chn_rescind_callback)(struct vmbus_channel *channel);
+ void (*chn_rescind_callback)(struct vmbus_channel *channel, void *arg);
+ void *rescind_arg;
/*
* The spinlock to protect the structure. It is being used to protect
@@ -957,8 +958,8 @@ static inline void clear_low_latency_mode(struct
vmbus_channel *c)
void vmbus_set_sc_create_callback(struct vmbus_channel *primary_channel,
void (*sc_cr_cb)(struct vmbus_channel *new_sc));
-void vmbus_set_chn_rescind_callback(struct vmbus_channel *channel,
- void (*chn_rescind_cb)(struct vmbus_channel *));
+void vmbus_set_chn_rescind_callback(struct vmbus_channel *channel, void *arg,
+ void (*chn_rescind_cb)(struct vmbus_channel *, void *));
/*
* Retrieve the (sub) channel on which to send an outgoing request.
--
1.7.4.1
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel