From owner-svn-src-all@freebsd.org Fri Jul 22 05:09:10 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 44D47BA18DD; Fri, 22 Jul 2016 05:09:10 +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 009261D75; Fri, 22 Jul 2016 05:09:09 +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 u6M599LU019659; Fri, 22 Jul 2016 05:09:09 GMT (envelope-from sephe@FreeBSD.org) Received: (from sephe@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u6M598KA019656; Fri, 22 Jul 2016 05:09:08 GMT (envelope-from sephe@FreeBSD.org) Message-Id: <201607220509.u6M598KA019656@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: sephe set sender to sephe@FreeBSD.org using -f From: Sepherosa Ziehau Date: Fri, 22 Jul 2016 05:09:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r303182 - 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: Fri, 22 Jul 2016 05:09:10 -0000 Author: sephe Date: Fri Jul 22 05:09:08 2016 New Revision: 303182 URL: https://svnweb.freebsd.org/changeset/base/303182 Log: hyperv/vmbus: Move vmbus bufring definition to vmbus_reg.h And add more comment about its fields. MFC after: 1 week Sponsored by: Microsoft OSTC Differential Revision: https://reviews.freebsd.org/D7269 Modified: head/sys/dev/hyperv/vmbus/hv_ring_buffer.c head/sys/dev/hyperv/vmbus/vmbus_chanvar.h head/sys/dev/hyperv/vmbus/vmbus_reg.h Modified: head/sys/dev/hyperv/vmbus/hv_ring_buffer.c ============================================================================== --- head/sys/dev/hyperv/vmbus/hv_ring_buffer.c Fri Jul 22 03:48:44 2016 (r303181) +++ head/sys/dev/hyperv/vmbus/hv_ring_buffer.c Fri Jul 22 05:09:08 2016 (r303182) @@ -32,6 +32,7 @@ #include #include "hv_vmbus_priv.h" +#include /* Amount of space to write to */ #define HV_BYTES_AVAIL_TO_WRITE(r, w, z) \ @@ -50,9 +51,9 @@ vmbus_br_sysctl_state(SYSCTL_HANDLER_ARG uint32_t rindex, windex, intr_mask, ravail, wavail; char state[256]; - rindex = br->ring_buffer->read_index; - windex = br->ring_buffer->write_index; - intr_mask = br->ring_buffer->interrupt_mask; + rindex = br->ring_buffer->br_rindex; + windex = br->ring_buffer->br_windex; + intr_mask = br->ring_buffer->br_imask; wavail = HV_BYTES_AVAIL_TO_WRITE(rindex, windex, br->ring_data_size); ravail = br->ring_data_size - wavail; @@ -78,13 +79,13 @@ vmbus_br_sysctl_state_bin(SYSCTL_HANDLER const hv_vmbus_ring_buffer_info *br = arg1; uint32_t rindex, windex, wavail, state[BR_STATE_MAX]; - rindex = br->ring_buffer->read_index; - windex = br->ring_buffer->write_index; + rindex = br->ring_buffer->br_rindex; + windex = br->ring_buffer->br_windex; wavail = HV_BYTES_AVAIL_TO_WRITE(rindex, windex, br->ring_data_size); state[BR_STATE_RIDX] = rindex; state[BR_STATE_WIDX] = windex; - state[BR_STATE_IMSK] = br->ring_buffer->interrupt_mask; + state[BR_STATE_IMSK] = br->ring_buffer->br_imask; state[BR_STATE_WSPC] = wavail; state[BR_STATE_RSPC] = br->ring_data_size - wavail; @@ -127,8 +128,8 @@ get_ring_buffer_avail_bytes(hv_vmbus_rin /* * Capture the read/write indices before they changed */ - read_loc = rbi->ring_buffer->read_index; - write_loc = rbi->ring_buffer->write_index; + read_loc = rbi->ring_buffer->br_rindex; + write_loc = rbi->ring_buffer->br_windex; *write = HV_BYTES_AVAIL_TO_WRITE(read_loc, write_loc, rbi->ring_data_size); @@ -141,7 +142,7 @@ get_ring_buffer_avail_bytes(hv_vmbus_rin static __inline uint32_t get_next_write_location(hv_vmbus_ring_buffer_info *ring_info) { - return ring_info->ring_buffer->write_index; + return ring_info->ring_buffer->br_windex; } /** @@ -151,7 +152,7 @@ static __inline void set_next_write_location(hv_vmbus_ring_buffer_info *ring_info, uint32_t next_write_location) { - ring_info->ring_buffer->write_index = next_write_location; + ring_info->ring_buffer->br_windex = next_write_location; } /** @@ -160,7 +161,7 @@ set_next_write_location(hv_vmbus_ring_bu static __inline uint32_t get_next_read_location(hv_vmbus_ring_buffer_info *ring_info) { - return ring_info->ring_buffer->read_index; + return ring_info->ring_buffer->br_rindex; } /** @@ -171,7 +172,7 @@ static __inline uint32_t get_next_read_location_with_offset(hv_vmbus_ring_buffer_info *ring_info, uint32_t offset) { - uint32_t next = ring_info->ring_buffer->read_index; + uint32_t next = ring_info->ring_buffer->br_rindex; next += offset; next %= ring_info->ring_data_size; @@ -185,7 +186,7 @@ static __inline void set_next_read_location(hv_vmbus_ring_buffer_info *ring_info, uint32_t next_read_location) { - ring_info->ring_buffer->read_index = next_read_location; + ring_info->ring_buffer->br_rindex = next_read_location; } /** @@ -194,7 +195,7 @@ set_next_read_location(hv_vmbus_ring_buf static __inline void * get_ring_buffer(hv_vmbus_ring_buffer_info *ring_info) { - return ring_info->ring_buffer->buffer; + return ring_info->ring_buffer->br_data; } /** @@ -212,13 +213,13 @@ get_ring_buffer_size(hv_vmbus_ring_buffe static __inline uint64_t get_ring_buffer_indices(hv_vmbus_ring_buffer_info *ring_info) { - return ((uint64_t)ring_info->ring_buffer->write_index) << 32; + return ((uint64_t)ring_info->ring_buffer->br_windex) << 32; } void hv_ring_buffer_read_begin(hv_vmbus_ring_buffer_info *ring_info) { - ring_info->ring_buffer->interrupt_mask = 1; + ring_info->ring_buffer->br_imask = 1; mb(); } @@ -227,7 +228,7 @@ hv_ring_buffer_read_end(hv_vmbus_ring_bu { uint32_t read, write; - ring_info->ring_buffer->interrupt_mask = 0; + ring_info->ring_buffer->br_imask = 0; mb(); /* @@ -259,7 +260,7 @@ hv_ring_buffer_needsig_on_write(uint32_t hv_vmbus_ring_buffer_info *rbi) { mb(); - if (rbi->ring_buffer->interrupt_mask) + if (rbi->ring_buffer->br_imask) return (FALSE); /* Read memory barrier */ @@ -268,7 +269,7 @@ hv_ring_buffer_needsig_on_write(uint32_t * This is the only case we need to signal when the * ring transitions from being empty to non-empty. */ - if (old_write_location == rbi->ring_buffer->read_index) + if (old_write_location == rbi->ring_buffer->br_rindex) return (TRUE); return (FALSE); @@ -284,10 +285,10 @@ hv_vmbus_ring_buffer_init(hv_vmbus_ring_ memset(ring_info, 0, sizeof(hv_vmbus_ring_buffer_info)); ring_info->ring_buffer = buffer; - ring_info->ring_buffer->read_index = 0; - ring_info->ring_buffer->write_index = 0; + ring_info->ring_buffer->br_rindex = 0; + ring_info->ring_buffer->br_windex = 0; - ring_info->ring_data_size = buffer_len - sizeof(hv_vmbus_ring_buffer); + ring_info->ring_data_size = buffer_len - sizeof(struct vmbus_bufring); mtx_init(&ring_info->ring_lock, "vmbus ring buffer", NULL, MTX_SPIN); return (0); Modified: head/sys/dev/hyperv/vmbus/vmbus_chanvar.h ============================================================================== --- head/sys/dev/hyperv/vmbus/vmbus_chanvar.h Fri Jul 22 03:48:44 2016 (r303181) +++ head/sys/dev/hyperv/vmbus/vmbus_chanvar.h Fri Jul 22 05:09:08 2016 (r303182) @@ -41,31 +41,7 @@ #include typedef struct { - /* - * offset in bytes from the start of ring data below - */ - volatile uint32_t write_index; - /* - * offset in bytes from the start of ring data below - */ - volatile uint32_t read_index; - /* - * NOTE: The interrupt_mask field is used only for channels, but - * vmbus connection also uses this data structure - */ - volatile uint32_t interrupt_mask; - /* pad it to PAGE_SIZE so that data starts on a page */ - uint8_t reserved[4084]; - - /* - * WARNING: Ring data starts here - * !!! DO NOT place any fields below this !!! - */ - uint8_t buffer[0]; /* doubles as interrupt mask */ -} __packed hv_vmbus_ring_buffer; - -typedef struct { - hv_vmbus_ring_buffer* ring_buffer; + struct vmbus_bufring *ring_buffer; struct mtx ring_lock; uint32_t ring_data_size; /* ring_size */ } hv_vmbus_ring_buffer_info; Modified: head/sys/dev/hyperv/vmbus/vmbus_reg.h ============================================================================== --- head/sys/dev/hyperv/vmbus/vmbus_reg.h Fri Jul 22 03:48:44 2016 (r303181) +++ head/sys/dev/hyperv/vmbus/vmbus_reg.h Fri Jul 22 05:09:08 2016 (r303182) @@ -102,6 +102,37 @@ struct vmbus_mnf { CTASSERT(sizeof(struct vmbus_mnf) == PAGE_SIZE); /* + * Buffer ring + */ +struct vmbus_bufring { + /* + * If br_windex == br_rindex, this bufring is empty; this + * means we can _not_ write data to the bufring, if the + * write is going to make br_windex same as br_rindex. + */ + volatile uint32_t br_windex; + volatile uint32_t br_rindex; + + /* + * Interrupt mask {0,1} + * + * For TX bufring, host set this to 1, when it is processing + * the TX bufring, so that we can safely skip the TX event + * notification to host. + * + * For RX bufring, once this is set to 1 by us, host will not + * further dispatch interrupts to us, even if there are data + * pending on the RX bufring. This effectively disables the + * interrupt of the channel to which this RX bufring is attached. + */ + volatile uint32_t br_imask; + + uint8_t br_rsvd[4084]; + uint8_t br_data[]; +} __packed; +CTASSERT(sizeof(struct vmbus_bufring) == PAGE_SIZE); + +/* * Channel */