Hi Mike,

On 4/17/23 21:39, Mike Pattrick wrote:
Hi Maxime,

On Fri, Mar 31, 2023 at 11:43 AM Maxime Coquelin
<maxime.coque...@redhat.com> wrote:

This patch introduces a helper to check whether two IOTLB
entries share a page.

Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
---
  lib/vhost/iotlb.c | 25 ++++++++++++++++++++-----
  1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/lib/vhost/iotlb.c b/lib/vhost/iotlb.c
index e8f1cb661e..d919f74704 100644
--- a/lib/vhost/iotlb.c
+++ b/lib/vhost/iotlb.c
@@ -23,6 +23,23 @@ struct vhost_iotlb_entry {

  #define IOTLB_CACHE_SIZE 2048

+static bool
+vhost_user_iotlb_share_page(struct vhost_iotlb_entry *a, struct 
vhost_iotlb_entry *b,
+               uint64_t align)
+{
+       uint64_t a_end, b_start;
+
+       if (a == NULL || b == NULL)
+               return false;
+
+       /* Assumes entry a lower than entry b */
+       RTE_ASSERT(a->uaddr < b->uaddr);
+       a_end = RTE_ALIGN_CEIL(a->uaddr + a->size, align);
+       b_start = RTE_ALIGN_FLOOR(b->uaddr, align);
+
+       return a_end > b_start;

This may be a very minor detail, but it might improve readability if
the a_end calculation used addr + size - 1 and the return conditional
used >=.

That's actually how I initially implemented it, but discussing with
David we agreed it would be better that way for consistency with
vhost_user_iotlb_clear_dump().

Regards,
Maxime


Cheers,
M


+}
+
  static void
  vhost_user_iotlb_set_dump(struct virtio_net *dev, struct vhost_iotlb_entry 
*node)
  {
@@ -37,16 +54,14 @@ static void
  vhost_user_iotlb_clear_dump(struct virtio_net *dev, struct vhost_iotlb_entry 
*node,
                 struct vhost_iotlb_entry *prev, struct vhost_iotlb_entry *next)
  {
-       uint64_t align, mask;
+       uint64_t align;

         align = hua_to_alignment(dev->mem, (void *)(uintptr_t)node->uaddr);
-       mask = ~(align - 1);

         /* Don't disable coredump if the previous node is in the same page */
-       if (prev == NULL || (node->uaddr & mask) != ((prev->uaddr + prev->size - 1) 
& mask)) {
+       if (!vhost_user_iotlb_share_page(prev, node, align)) {
                 /* Don't disable coredump if the next node is in the same page 
*/
-               if (next == NULL ||
-                               ((node->uaddr + node->size - 1) & mask) != 
(next->uaddr & mask))
+               if (!vhost_user_iotlb_share_page(node, next, align))
                         mem_set_dump((void *)(uintptr_t)node->uaddr, 
node->size, false, align);
         }
  }
--
2.39.2



Reply via email to