From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753569AbcIBLJ7 (ORCPT ); Fri, 2 Sep 2016 07:09:59 -0400 Received: from p3plsmtps2ded02.prod.phx3.secureserver.net ([208.109.80.59]:53066 "EHLO p3plsmtps2ded02.prod.phx3.secureserver.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752782AbcIBLJ4 (ORCPT ); Fri, 2 Sep 2016 07:09:56 -0400 x-originating-ip: 72.167.245.219 From: kys@exchange.microsoft.com To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com, vkuznets@redhat.com, jasowang@redhat.com, leann.ogasawara@canonical.com, alexng@microsoft.com Cc: "K. Y. Srinivasan" Subject: [PATCH 4/7] Drivers: hv: ring_buffer: count on wrap around mappings in get_next_pkt_raw() Date: Fri, 2 Sep 2016 05:58:22 -0700 Message-Id: <1472821105-7150-4-git-send-email-kys@exchange.microsoft.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1472821105-7150-1-git-send-email-kys@exchange.microsoft.com> References: <1472821013-7106-1-git-send-email-kys@exchange.microsoft.com> <1472821105-7150-1-git-send-email-kys@exchange.microsoft.com> Reply-To: kys@microsoft.com X-CMAE-Envelope: MS4wfO3sN2Iuji5eXbp0RRGd1YmkS8Ne+qwnT3xVDSFy0Qj5vsbD6Q5LAVp2StYEKKk5NC9LC8zos4ZYNLPqYIpRHjImWUjPw/DqZMoPtcIeFWy/Nx9k4R2Y xakf4kMo+kBDueQdNL2gSuFw0MePTM5hbgqG6uT0J5hG4A4WsDnmnskeFIzXUOt/AUTVs8JW3TiGv5nPBGh2iVx17KnbbPn0vDEWzaPK48TW/8u57RaKFhIg mcb9FGD4BXYQA/jUwKg2zg6eNcobVuvMhAsyuGoqkMwZ4Z4ocYxJxD4JryL1BiZbLJtyVySdIPWvjWBmYhSPRmlC3xAQvCqvCPymV4WmMNujWBqKM5czX55W qwVTVt2sy3d6kw6E7ZJdpekg8tPBQo9kUrDgTjWqgzDycWt+fQkh/+oQIPpVio5YxNMsv7vitVkbze9HPP6QcrMbK58IzbwdDdaaV+ISIHmHkmWUMKZiXriM kMC8Eawsd2VervQP Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Vitaly Kuznetsov With wrap around mappings in place we can always provide drivers with direct links to packets on the ring buffer, even when they wrap around. Do the required updates to get_next_pkt_raw()/put_pkt_raw() Signed-off-by: Vitaly Kuznetsov Signed-off-by: K. Y. Srinivasan Tested-by: Dexuan Cui --- include/linux/hyperv.h | 32 +++++++++++--------------------- 1 files changed, 11 insertions(+), 21 deletions(-) diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index 755e8f5..e6ef571 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -1469,31 +1469,23 @@ static inline struct vmpacket_descriptor * get_next_pkt_raw(struct vmbus_channel *channel) { struct hv_ring_buffer_info *ring_info = &channel->inbound; - u32 read_loc = ring_info->priv_read_index; + u32 priv_read_loc = ring_info->priv_read_index; void *ring_buffer = hv_get_ring_buffer(ring_info); - struct vmpacket_descriptor *cur_desc; - u32 packetlen; u32 dsize = ring_info->ring_datasize; - u32 delta = read_loc - ring_info->ring_buffer->read_index; + /* + * delta is the difference between what is available to read and + * what was already consumed in place. We commit read index after + * the whole batch is processed. + */ + u32 delta = priv_read_loc >= ring_info->ring_buffer->read_index ? + priv_read_loc - ring_info->ring_buffer->read_index : + (dsize - ring_info->ring_buffer->read_index) + priv_read_loc; u32 bytes_avail_toread = (hv_get_bytes_to_read(ring_info) - delta); if (bytes_avail_toread < sizeof(struct vmpacket_descriptor)) return NULL; - if ((read_loc + sizeof(*cur_desc)) > dsize) - return NULL; - - cur_desc = ring_buffer + read_loc; - packetlen = cur_desc->len8 << 3; - - /* - * If the packet under consideration is wrapping around, - * return failure. - */ - if ((read_loc + packetlen + VMBUS_PKT_TRAILER) > (dsize - 1)) - return NULL; - - return cur_desc; + return ring_buffer + priv_read_loc; } /* @@ -1505,16 +1497,14 @@ static inline void put_pkt_raw(struct vmbus_channel *channel, struct vmpacket_descriptor *desc) { struct hv_ring_buffer_info *ring_info = &channel->inbound; - u32 read_loc = ring_info->priv_read_index; u32 packetlen = desc->len8 << 3; u32 dsize = ring_info->ring_datasize; - if ((read_loc + packetlen + VMBUS_PKT_TRAILER) > dsize) - BUG(); /* * Include the packet trailer. */ ring_info->priv_read_index += packetlen + VMBUS_PKT_TRAILER; + ring_info->priv_read_index %= dsize; } /* -- 1.7.4.1