summaryrefslogtreecommitdiffstats
path: root/drivers/hv/channel_mgmt.c
diff options
context:
space:
mode:
authorStephen Hemminger <stephen@networkplumber.org>2017-02-12 07:02:20 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-02-14 19:20:35 +0100
commit631e63a9f346cb657761ae22138f294718696501 (patch)
tree9d207333ca07e73282e8c7e8a4c36cf73f0d7b63 /drivers/hv/channel_mgmt.c
parentvmbus: put related per-cpu variable together (diff)
downloadlinux-631e63a9f346cb657761ae22138f294718696501.tar.xz
linux-631e63a9f346cb657761ae22138f294718696501.zip
vmbus: change to per channel tasklet
Make the event handling tasklet per channel rather than per-cpu. This allows for better fairness when getting lots of data on the same cpu. Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com> Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv/channel_mgmt.c')
-rw-r--r--drivers/hv/channel_mgmt.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
index 579ad2560a39..2f6270d76b79 100644
--- a/drivers/hv/channel_mgmt.c
+++ b/drivers/hv/channel_mgmt.c
@@ -339,6 +339,9 @@ static struct vmbus_channel *alloc_channel(void)
INIT_LIST_HEAD(&channel->sc_list);
INIT_LIST_HEAD(&channel->percpu_list);
+ tasklet_init(&channel->callback_event,
+ vmbus_on_event, (unsigned long)channel);
+
return channel;
}
@@ -347,6 +350,7 @@ static struct vmbus_channel *alloc_channel(void)
*/
static void free_channel(struct vmbus_channel *channel)
{
+ tasklet_kill(&channel->callback_event);
kfree(channel);
}
@@ -380,21 +384,15 @@ static void vmbus_release_relid(u32 relid)
void hv_event_tasklet_disable(struct vmbus_channel *channel)
{
- struct hv_per_cpu_context *hv_cpu;
-
- hv_cpu = per_cpu_ptr(hv_context.cpu_context, channel->target_cpu);
- tasklet_disable(&hv_cpu->event_dpc);
+ tasklet_disable(&channel->callback_event);
}
void hv_event_tasklet_enable(struct vmbus_channel *channel)
{
- struct hv_per_cpu_context *hv_cpu;
-
- hv_cpu = per_cpu_ptr(hv_context.cpu_context, channel->target_cpu);
- tasklet_enable(&hv_cpu->event_dpc);
+ tasklet_enable(&channel->callback_event);
/* In case there is any pending event */
- tasklet_schedule(&hv_cpu->event_dpc);
+ tasklet_schedule(&channel->callback_event);
}
void hv_process_channel_removal(struct vmbus_channel *channel, u32 relid)