aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hv/channel_mgmt.c
diff options
context:
space:
mode:
authorK. Y. Srinivasan <kys@microsoft.com>2014-04-08 21:45:53 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-05-03 19:24:26 -0400
commitd3ba720dd58cdf6630fee4b89482c465d5ad0d0f (patch)
tree03ea0aba6f0509bf7c501dee9ae6e931634f3c4b /drivers/hv/channel_mgmt.c
parente4d8270e604c3202131bac607969605ac397b893 (diff)
Drivers: hv: Eliminate the channel spinlock in the callback path
By ensuring that we set the callback handler to NULL in the channel close path on the same CPU that the channel is bound to, we can eliminate this lock acquisition and release in a performance critical path. Signed-off-by: K. Y. Srinivasan <kys@microsoft.com> Reviewed-by: Haiyang Zhang <haiyangz@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.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
index fa920469bf10..6f7fdd9a7e77 100644
--- a/drivers/hv/channel_mgmt.c
+++ b/drivers/hv/channel_mgmt.c
@@ -365,7 +365,7 @@ static u32 next_vp;
365 * performance critical channels (IDE, SCSI and Network) will be uniformly 365 * performance critical channels (IDE, SCSI and Network) will be uniformly
366 * distributed across all available CPUs. 366 * distributed across all available CPUs.
367 */ 367 */
368static u32 get_vp_index(uuid_le *type_guid) 368static void init_vp_index(struct vmbus_channel *channel, uuid_le *type_guid)
369{ 369{
370 u32 cur_cpu; 370 u32 cur_cpu;
371 int i; 371 int i;
@@ -387,10 +387,13 @@ static u32 get_vp_index(uuid_le *type_guid)
387 * Also if the channel is not a performance critical 387 * Also if the channel is not a performance critical
388 * channel, bind it to cpu 0. 388 * channel, bind it to cpu 0.
389 */ 389 */
390 return 0; 390 channel->target_cpu = 0;
391 channel->target_vp = 0;
392 return;
391 } 393 }
392 cur_cpu = (++next_vp % max_cpus); 394 cur_cpu = (++next_vp % max_cpus);
393 return hv_context.vp_index[cur_cpu]; 395 channel->target_cpu = cur_cpu;
396 channel->target_vp = hv_context.vp_index[cur_cpu];
394} 397}
395 398
396/* 399/*
@@ -438,7 +441,7 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
438 offer->connection_id; 441 offer->connection_id;
439 } 442 }
440 443
441 newchannel->target_vp = get_vp_index(&offer->offer.if_type); 444 init_vp_index(newchannel, &offer->offer.if_type);
442 445
443 memcpy(&newchannel->offermsg, offer, 446 memcpy(&newchannel->offermsg, offer,
444 sizeof(struct vmbus_channel_offer_channel)); 447 sizeof(struct vmbus_channel_offer_channel));