On Sat, Dec 03, 2016 at 12:34:31PM -0800, k...@exchange.microsoft.com wrote: > From: K. Y. Srinivasan <k...@microsoft.com> > > 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.
Eeek, why a void *? Please make this a _real_ pointer. > > Signed-off-by: K. Y. Srinivasan <k...@microsoft.com> > --- > 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; Why does the channel have rescind_arg here? Where do you use this functionality? thanks, greg k-h