Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755396AbbDUO16 (ORCPT ); Tue, 21 Apr 2015 10:27:58 -0400 Received: from mx1.redhat.com ([209.132.183.28]:55044 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751751AbbDUO1x (ORCPT ); Tue, 21 Apr 2015 10:27:53 -0400 From: Vitaly Kuznetsov To: "K. Y. Srinivasan" Cc: Haiyang Zhang , devel@linuxdriverproject.org, linux-kernel@vger.kernel.org, Dexuan Cui Subject: [PATCH 4/6] Drivers: hv: vmbus: move init_vp_index() call to vmbus_process_offer() Date: Tue, 21 Apr 2015 16:27:38 +0200 Message-Id: <1429626460-7947-5-git-send-email-vkuznets@redhat.com> In-Reply-To: <1429626460-7947-1-git-send-email-vkuznets@redhat.com> References: <1429626460-7947-1-git-send-email-vkuznets@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5500 Lines: 193 We need to call init_vp_index() after we added the channel to the appropriate list (global or subchannel) to be able to use this information when assigning the channel to the particular vcpu. To do so we need to move a couple of functions around. The only real change is the init_vp_index() call. This is a small refactoring without a functional change. Signed-off-by: Vitaly Kuznetsov --- drivers/hv/channel_mgmt.c | 142 +++++++++++++++++++++++----------------------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c index 8b4b561..8f2761f 100644 --- a/drivers/hv/channel_mgmt.c +++ b/drivers/hv/channel_mgmt.c @@ -226,6 +226,75 @@ void vmbus_free_channels(void) } } +enum { + IDE = 0, + SCSI, + NIC, + MAX_PERF_CHN, +}; + +/* + * This is an array of device_ids (device types) that are performance critical. + * We attempt to distribute the interrupt load for these devices across + * all available CPUs. + */ +static const struct hv_vmbus_device_id hp_devs[] = { + /* IDE */ + { HV_IDE_GUID, }, + /* Storage - SCSI */ + { HV_SCSI_GUID, }, + /* Network */ + { HV_NIC_GUID, }, + /* NetworkDirect Guest RDMA */ + { HV_ND_GUID, }, +}; + +/* + * We use this state to statically distribute the channel interrupt load. + */ +static u32 next_vp; + +/* + * Starting with Win8, we can statically distribute the incoming + * channel interrupt load by binding a channel to VCPU. We + * implement here a simple round robin scheme for distributing + * the interrupt load. + * We will bind channels that are not performance critical to cpu 0 and + * performance critical channels (IDE, SCSI and Network) will be uniformly + * distributed across all available CPUs. + */ +static void init_vp_index(struct vmbus_channel *channel, + const uuid_le *type_guid) +{ + u32 cur_cpu; + int i; + bool perf_chn = false; + u32 max_cpus = num_online_cpus(); + + for (i = IDE; i < MAX_PERF_CHN; i++) { + if (!memcmp(type_guid->b, hp_devs[i].guid, + sizeof(uuid_le))) { + perf_chn = true; + break; + } + } + if ((vmbus_proto_version == VERSION_WS2008) || + (vmbus_proto_version == VERSION_WIN7) || (!perf_chn)) { + /* + * Prior to win8, all channel interrupts are + * delivered on cpu 0. + * Also if the channel is not a performance critical + * channel, bind it to cpu 0. + */ + channel->target_cpu = 0; + channel->target_vp = 0; + return; + } + cur_cpu = (++next_vp % max_cpus); + channel->target_cpu = cur_cpu; + channel->target_vp = hv_context.vp_index[cur_cpu]; +} + /* * vmbus_process_offer - Process the offer by creating a channel/device * associated with this offer @@ -272,6 +341,8 @@ static void vmbus_process_offer(struct vmbus_channel *newchannel) goto err_free_chan; } + init_vp_index(newchannel, &newchannel->offermsg.offer.if_type); + if (newchannel->target_cpu != get_cpu()) { put_cpu(); smp_call_function_single(newchannel->target_cpu, @@ -338,75 +409,6 @@ err_free_chan: free_channel(newchannel); } -enum { - IDE = 0, - SCSI, - NIC, - MAX_PERF_CHN, -}; - -/* - * This is an array of device_ids (device types) that are performance critical. - * We attempt to distribute the interrupt load for these devices across - * all available CPUs. - */ -static const struct hv_vmbus_device_id hp_devs[] = { - /* IDE */ - { HV_IDE_GUID, }, - /* Storage - SCSI */ - { HV_SCSI_GUID, }, - /* Network */ - { HV_NIC_GUID, }, - /* NetworkDirect Guest RDMA */ - { HV_ND_GUID, }, -}; - - -/* - * We use this state to statically distribute the channel interrupt load. - */ -static u32 next_vp; - -/* - * Starting with Win8, we can statically distribute the incoming - * channel interrupt load by binding a channel to VCPU. We - * implement here a simple round robin scheme for distributing - * the interrupt load. - * We will bind channels that are not performance critical to cpu 0 and - * performance critical channels (IDE, SCSI and Network) will be uniformly - * distributed across all available CPUs. - */ -static void init_vp_index(struct vmbus_channel *channel, const uuid_le *type_guid) -{ - u32 cur_cpu; - int i; - bool perf_chn = false; - u32 max_cpus = num_online_cpus(); - - for (i = IDE; i < MAX_PERF_CHN; i++) { - if (!memcmp(type_guid->b, hp_devs[i].guid, - sizeof(uuid_le))) { - perf_chn = true; - break; - } - } - if ((vmbus_proto_version == VERSION_WS2008) || - (vmbus_proto_version == VERSION_WIN7) || (!perf_chn)) { - /* - * Prior to win8, all channel interrupts are - * delivered on cpu 0. - * Also if the channel is not a performance critical - * channel, bind it to cpu 0. - */ - channel->target_cpu = 0; - channel->target_vp = 0; - return; - } - cur_cpu = (++next_vp % max_cpus); - channel->target_cpu = cur_cpu; - channel->target_vp = hv_context.vp_index[cur_cpu]; -} - /* * vmbus_unload_response - Handler for the unload response. */ @@ -476,8 +478,6 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr) offer->connection_id; } - init_vp_index(newchannel, &offer->offer.if_type); - memcpy(&newchannel->offermsg, offer, sizeof(struct vmbus_channel_offer_channel)); newchannel->monitor_grp = (u8)offer->monitorid / 32; -- 1.9.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/