From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S938554AbcIFReU (ORCPT ); Tue, 6 Sep 2016 13:34:20 -0400 Received: from p3plsmtps2ded01.prod.phx3.secureserver.net ([208.109.80.58]:37222 "EHLO p3plsmtps2ded01.prod.phx3.secureserver.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755016AbcIFReR (ORCPT ); Tue, 6 Sep 2016 13:34:17 -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, sfr@canb.auug.org.au, davem@davemloft.net, sthemmin@microsoft.com, arnd@arndb.de Cc: "K. Y. Srinivasan" Subject: [PATCH V2 1/1] Revert "Drivers: hv: ring_buffer: count on wrap around mappings in get_next_pkt_raw()" Date: Tue, 6 Sep 2016 12:23:21 -0700 Message-Id: <1473189801-15913-1-git-send-email-kys@exchange.microsoft.com> X-Mailer: git-send-email 1.7.4.1 Reply-To: kys@microsoft.com X-CMAE-Envelope: MS4wfEJ4KHqaRh2SqQRxyuBFRe8RIaGBfEnoMDKuOqPIldxxhxFoOSkjunhA2m7VyD662HrtL651WBeLUe7nf2EsmjJ6hcaYGtdvlB7etj58tnq46p6SBNxR RSvGLczQE7g3tOoDl8uO/Q6Z59ZKexu9L2Z5Mr1sfHYoXq/Hg7MLresU/vzgFa6Wdo8ls8fDxWevvoZQmAKabj13FURGkoiGUmG4iu6v7KKgq1x9qit+in9A 0effiu5KgIVh8HHrUTqup5ImgWgVxR8Yifi9BQEoQVItP0akMGzDKXEEzIitax8lISQucuGUtA5ZE9H0VKcaff5JMlJoQeUpNyjaA5J0xYOqVez2RCF1e311 3MKUmmAVEGTrmpyP18eUFKK/WLLrbbLzTKMxWPhi1hMX9VVcmiBuDkzBwFDwrGHp4PfcX9qYHffkQByqc2fUA32w41JqfvHhTS2CrIW2tS7j503b77jxcABp dZzEwId4zUI0a+fuI9kOKTR19RpQrQiN97Vw3l+3u9yoRJZeCPWf37ZLHZmUgj6uXrFGECSLzdN2vStfE2BA5QwVe69J3ZDJC+lq19dHs1g/PaJcoh1smLiF wAw= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: K. Y. Srinivasan To deal with the merge conflict between net-next and char-misc trees, revert commit bb08d431a914 from char-misc tree. This commit can be rebased and applied once net-next picks up char-misc changes. Here is the commit log of the reverted patch: "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: K. Y. Srinivasan --- V2: Added the log of the reverted patch (Greg) V2: Added the missing sign-off line (Greg) V2: Fix the subject line (Dan Carpenter) include/linux/hyperv.h | 32 +++++++++++++++++++++----------- 1 files changed, 21 insertions(+), 11 deletions(-) diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index c877e79..613074e 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -1492,23 +1492,31 @@ static inline struct vmpacket_descriptor * get_next_pkt_raw(struct vmbus_channel *channel) { struct hv_ring_buffer_info *ring_info = &channel->inbound; - u32 priv_read_loc = ring_info->priv_read_index; + u32 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; - /* - * 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 delta = read_loc - ring_info->ring_buffer->read_index; u32 bytes_avail_toread = (hv_get_bytes_to_read(ring_info) - delta); if (bytes_avail_toread < sizeof(struct vmpacket_descriptor)) return NULL; - return ring_buffer + priv_read_loc; + 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; } /* @@ -1520,14 +1528,16 @@ 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