From owner-svn-src-all@freebsd.org Wed May 18 02:59:47 2016 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id A1D59B40A58; Wed, 18 May 2016 02:59:47 +0000 (UTC) (envelope-from sephe@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 6D9F3198C; Wed, 18 May 2016 02:59:47 +0000 (UTC) (envelope-from sephe@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u4I2xkb5093776; Wed, 18 May 2016 02:59:46 GMT (envelope-from sephe@FreeBSD.org) Received: (from sephe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u4I2xk4G093774; Wed, 18 May 2016 02:59:46 GMT (envelope-from sephe@FreeBSD.org) Message-Id: <201605180259.u4I2xk4G093774@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: sephe set sender to sephe@FreeBSD.org using -f From: Sepherosa Ziehau Date: Wed, 18 May 2016 02:59:46 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r300101 - head/sys/dev/hyperv/vmbus X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 May 2016 02:59:47 -0000 Author: sephe Date: Wed May 18 02:59:46 2016 New Revision: 300101 URL: https://svnweb.freebsd.org/changeset/base/300101 Log: hyperv/vmbus: Use unsigned long for event bits. And move base channel id calculation out of inner loop. This prepares for more event processing optimization. MFC after: 1 week Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D6384 Modified: head/sys/dev/hyperv/vmbus/hv_connection.c head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h Modified: head/sys/dev/hyperv/vmbus/hv_connection.c ============================================================================== --- head/sys/dev/hyperv/vmbus/hv_connection.c Wed May 18 02:10:05 2016 (r300100) +++ head/sys/dev/hyperv/vmbus/hv_connection.c Wed May 18 02:59:46 2016 (r300101) @@ -294,13 +294,10 @@ hv_vmbus_disconnect(void) { void hv_vmbus_on_events(int cpu) { - int bit; - int dword; - void *page_addr; - uint32_t* recv_interrupt_page = NULL; - int rel_id; - int maxdword; + unsigned long *intr_page; hv_vmbus_synic_event_flags *event; + void *page_addr; + int page_cnt, pg; KASSERT(cpu <= mp_maxid, ("VMBUS: hv_vmbus_on_events: " "cpu out of range!")); @@ -310,39 +307,42 @@ hv_vmbus_on_events(int cpu) page_addr + HV_VMBUS_MESSAGE_SINT; if ((hv_vmbus_protocal_version == HV_VMBUS_VERSION_WS2008) || (hv_vmbus_protocal_version == HV_VMBUS_VERSION_WIN7)) { - maxdword = HV_MAX_NUM_CHANNELS_SUPPORTED >> 5; + page_cnt = HV_MAX_NUM_CHANNELS_SUPPORTED >> + HV_CHANNEL_ULONG_SHIFT; /* * receive size is 1/2 page and divide that by 4 bytes */ - if (atomic_testandclear_int(&event->flags32[0], 0)) { - recv_interrupt_page = - hv_vmbus_g_connection.recv_interrupt_page; - } else { + if (atomic_testandclear_int(&event->flags32[0], 0)) + intr_page = hv_vmbus_g_connection.recv_interrupt_page; + else return; - } } else { /* * On Host with Win8 or above, the event page can be * checked directly to get the id of the channel * that has the pending interrupt. */ - maxdword = HV_EVENT_FLAGS_DWORD_COUNT; - recv_interrupt_page = event->flags32; + page_cnt = HV_EVENT_FLAGS_ULONG_COUNT; + intr_page = event->flagsul; } /* * Check events */ - for (dword = 0; dword < maxdword; dword++) { - if (recv_interrupt_page[dword] == 0) + for (pg = 0; pg < page_cnt; pg++) { + uint32_t rel_id_base; + int bit; + + if (intr_page[pg] == 0) continue; - for (bit = 0; bit < HV_CHANNEL_DWORD_LEN; bit++) { - if (atomic_testandclear_int( - &recv_interrupt_page[dword], bit)) { + rel_id_base = pg << HV_CHANNEL_ULONG_SHIFT; + for (bit = 0; bit < HV_CHANNEL_ULONG_LEN; bit++) { + if (atomic_testandclear_long(&intr_page[pg], bit)) { struct hv_vmbus_channel *channel; + uint32_t rel_id; - rel_id = (dword << 5) + bit; + rel_id = rel_id_base + bit; channel = hv_vmbus_g_connection.channels[rel_id]; @@ -357,7 +357,7 @@ hv_vmbus_on_events(int cpu) taskqueue_enqueue(channel->rxq, &channel->channel_task); } - } + } } } Modified: head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h ============================================================================== --- head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h Wed May 18 02:10:05 2016 (r300100) +++ head/sys/dev/hyperv/vmbus/hv_vmbus_priv.h Wed May 18 02:59:46 2016 (r300101) @@ -57,10 +57,18 @@ typedef uint16_t hv_vmbus_status; #define HV_EVENT_FLAGS_COUNT (256 * 8) #define HV_EVENT_FLAGS_BYTE_COUNT (256) #define HV_EVENT_FLAGS_DWORD_COUNT (256 / sizeof(uint32_t)) +#define HV_EVENT_FLAGS_ULONG_COUNT (256 / sizeof(unsigned long)) /** * max channel count <== event_flags_dword_count * bit_of_dword */ +#ifdef __LP64__ +#define HV_CHANNEL_ULONG_LEN (64) +#define HV_CHANNEL_ULONG_SHIFT (6) +#else +#define HV_CHANNEL_ULONG_LEN (32) +#define HV_CHANNEL_ULONG_SHIFT (5) +#endif #define HV_CHANNEL_DWORD_LEN (32) #define HV_CHANNEL_MAX_COUNT \ ((HV_EVENT_FLAGS_DWORD_COUNT) * HV_CHANNEL_DWORD_LEN) @@ -575,7 +583,9 @@ typedef struct { typedef union { uint8_t flags8[HV_EVENT_FLAGS_BYTE_COUNT]; uint32_t flags32[HV_EVENT_FLAGS_DWORD_COUNT]; + unsigned long flagsul[HV_EVENT_FLAGS_ULONG_COUNT]; } hv_vmbus_synic_event_flags; +CTASSERT(sizeof(hv_vmbus_synic_event_flags) == HV_EVENT_FLAGS_BYTE_COUNT); #define HV_X64_CPUID_MIN (0x40000005) #define HV_X64_CPUID_MAX (0x4000ffff)