Drivers: hv: vmbus: Refactor the ring-buffer iterator functions
authorAndrea Parri (Microsoft) <parri.andrea@gmail.com>
Thu, 28 Apr 2022 14:51:07 +0000 (16:51 +0200)
committerWei Liu <wei.liu@kernel.org>
Thu, 28 Apr 2022 15:01:15 +0000 (15:01 +0000)
With no users of hv_pkt_iter_next_raw() and no "external" users of
hv_pkt_iter_first_raw(), the iterator functions can be refactored
and simplified to remove some indirection/code.

Signed-off-by: Andrea Parri (Microsoft) <parri.andrea@gmail.com>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Link: https://lore.kernel.org/r/20220428145107.7878-6-parri.andrea@gmail.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>
drivers/hv/ring_buffer.c
include/linux/hyperv.h

index e101b11..59a4aa8 100644 (file)
@@ -429,7 +429,7 @@ int hv_ringbuffer_read(struct vmbus_channel *channel,
        memcpy(buffer, (const char *)desc + offset, packetlen);
 
        /* Advance ring index to next packet descriptor */
-       __hv_pkt_iter_next(channel, desc, true);
+       __hv_pkt_iter_next(channel, desc);
 
        /* Notify host of update */
        hv_pkt_iter_close(channel);
@@ -465,22 +465,6 @@ static u32 hv_pkt_iter_avail(const struct hv_ring_buffer_info *rbi)
 }
 
 /*
- * Get first vmbus packet without copying it out of the ring buffer
- */
-struct vmpacket_descriptor *hv_pkt_iter_first_raw(struct vmbus_channel *channel)
-{
-       struct hv_ring_buffer_info *rbi = &channel->inbound;
-
-       hv_debug_delay_test(channel, MESSAGE_DELAY);
-
-       if (hv_pkt_iter_avail(rbi) < sizeof(struct vmpacket_descriptor))
-               return NULL;
-
-       return (struct vmpacket_descriptor *)(hv_get_ring_buffer(rbi) + rbi->priv_read_index);
-}
-EXPORT_SYMBOL_GPL(hv_pkt_iter_first_raw);
-
-/*
  * Get first vmbus packet from ring buffer after read_index
  *
  * If ring buffer is empty, returns NULL and no other action needed.
@@ -491,11 +475,14 @@ struct vmpacket_descriptor *hv_pkt_iter_first(struct vmbus_channel *channel)
        struct vmpacket_descriptor *desc, *desc_copy;
        u32 bytes_avail, pkt_len, pkt_offset;
 
-       desc = hv_pkt_iter_first_raw(channel);
-       if (!desc)
+       hv_debug_delay_test(channel, MESSAGE_DELAY);
+
+       bytes_avail = hv_pkt_iter_avail(rbi);
+       if (bytes_avail < sizeof(struct vmpacket_descriptor))
                return NULL;
+       bytes_avail = min(rbi->pkt_buffer_size, bytes_avail);
 
-       bytes_avail = min(rbi->pkt_buffer_size, hv_pkt_iter_avail(rbi));
+       desc = (struct vmpacket_descriptor *)(hv_get_ring_buffer(rbi) + rbi->priv_read_index);
 
        /*
         * Ensure the compiler does not use references to incoming Hyper-V values (which
@@ -542,8 +529,7 @@ EXPORT_SYMBOL_GPL(hv_pkt_iter_first);
  */
 struct vmpacket_descriptor *
 __hv_pkt_iter_next(struct vmbus_channel *channel,
-                  const struct vmpacket_descriptor *desc,
-                  bool copy)
+                  const struct vmpacket_descriptor *desc)
 {
        struct hv_ring_buffer_info *rbi = &channel->inbound;
        u32 packetlen = desc->len8 << 3;
@@ -556,7 +542,7 @@ __hv_pkt_iter_next(struct vmbus_channel *channel,
                rbi->priv_read_index -= dsize;
 
        /* more data? */
-       return copy ? hv_pkt_iter_first(channel) : hv_pkt_iter_first_raw(channel);
+       return hv_pkt_iter_first(channel);
 }
 EXPORT_SYMBOL_GPL(__hv_pkt_iter_next);
 
index b028905..c440c45 100644 (file)
@@ -1707,54 +1707,27 @@ static inline u32 hv_pkt_len(const struct vmpacket_descriptor *desc)
 }
 
 struct vmpacket_descriptor *
-hv_pkt_iter_first_raw(struct vmbus_channel *channel);
-
-struct vmpacket_descriptor *
 hv_pkt_iter_first(struct vmbus_channel *channel);
 
 struct vmpacket_descriptor *
 __hv_pkt_iter_next(struct vmbus_channel *channel,
-                  const struct vmpacket_descriptor *pkt,
-                  bool copy);
+                  const struct vmpacket_descriptor *pkt);
 
 void hv_pkt_iter_close(struct vmbus_channel *channel);
 
 static inline struct vmpacket_descriptor *
-hv_pkt_iter_next_pkt(struct vmbus_channel *channel,
-                    const struct vmpacket_descriptor *pkt,
-                    bool copy)
+hv_pkt_iter_next(struct vmbus_channel *channel,
+                const struct vmpacket_descriptor *pkt)
 {
        struct vmpacket_descriptor *nxt;
 
-       nxt = __hv_pkt_iter_next(channel, pkt, copy);
+       nxt = __hv_pkt_iter_next(channel, pkt);
        if (!nxt)
                hv_pkt_iter_close(channel);
 
        return nxt;
 }
 
-/*
- * Get next packet descriptor without copying it out of the ring buffer
- * If at end of list, return NULL and update host.
- */
-static inline struct vmpacket_descriptor *
-hv_pkt_iter_next_raw(struct vmbus_channel *channel,
-                    const struct vmpacket_descriptor *pkt)
-{
-       return hv_pkt_iter_next_pkt(channel, pkt, false);
-}
-
-/*
- * Get next packet descriptor from iterator
- * If at end of list, return NULL and update host.
- */
-static inline struct vmpacket_descriptor *
-hv_pkt_iter_next(struct vmbus_channel *channel,
-                const struct vmpacket_descriptor *pkt)
-{
-       return hv_pkt_iter_next_pkt(channel, pkt, true);
-}
-
 #define foreach_vmbus_pkt(pkt, channel) \
        for (pkt = hv_pkt_iter_first(channel); pkt; \
            pkt = hv_pkt_iter_next(channel, pkt))