[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v3] xen: simplify bitmap_to_xenctl_bitmap for little endian


  • To: <xen-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Stefano Stabellini <stefano.stabellini@xxxxxxx>
  • Date: Thu, 27 Mar 2025 16:34:19 -0700
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=lists.xenproject.org smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none (0)
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=DxGiGT+5FrG26tFJesGKy21PvaBF5tmc1jLI4X5eyBQ=; b=uGk9WM8tzgTTkgTuLAVQhfx+grGWKpvdjjz1xcYpZ9dwJYWSmzUK1s4CmL/F21v5Q/5v7WMOzgVWPgYVWZ4LTMRhOCiIOm37L+OUXAjORljXmuiLKgYM/FwwsBTANc2TZkl2A+Fo+AbXBdpz6pR94ud2vi6x2qEnHOm9+DzW6Xmmgji/jqZL2GQv0os0rnYHBolVnAG9KnTp2JokuG/yH+bYE4pJfl7Rg1rCNlZ0Uk8RWlS3qZ6+OegyK93V3wJb6DmhSx6BUYDZUUq/Ho84r2cRte9u7gcN40ggv+/4Wmm0LT0ak/4UJGiX2VWmHEgdCZVj1YWcUklynisuUnB8dw==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=lIU8hSbFiveeea3tDYv3YwzPgylW99V6EsjupXKgm4Fy9k+U7KTzh1Pwhm57uCzy2lzu+D6xuzl0rKiBp6UtKUQ8hYslJm0VhUNyoZ05r3phE7c3WeqVYB+PS3oFpgEwqlQVm0uxb5aXiXGy7kIqK6qqbKdhdJa21iNCqnFVJo8rMiGubwdJYQ4Sn+nGUWF09oYyRgD9zE3Gd4ISf+DLbRbFv5QSTRLl+DZ9XtIWmKljRglZOI8Je749B6PXLCGpaThmx2zsV1EJ/VAkJagP4cw/P0wDqmUABRhjuz2r9LjqwUXnCyOo18pEl0L13DsAE1sYRgR+YrmaM79z4Gj7kg==
  • Cc: <sstabellini@xxxxxxxxxx>, <andrew.cooper3@xxxxxxxxxx>, <jbeulich@xxxxxxxx>, <roger.pau@xxxxxxxxxx>, <julien@xxxxxxx>, <michal.orzel@xxxxxxx>, <bertrand.marquis@xxxxxxx>, Stefano Stabellini <stefano.stabellini@xxxxxxx>
  • Delivery-date: Thu, 27 Mar 2025 23:34:33 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

The little endian implementation of bitmap_to_xenctl_bitmap leads to
unnecessary xmallocs and xfrees. Given that Xen only supports little
endian architectures, it is worth optimizing.

This patch removes the need for the xmalloc on little endian
architectures.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxx>
---
Changes in v3:
- code style
- copy_bytes > 1 checks
- copy_bytes > 0 check for copy_to_guest_offset
---
 xen/common/bitmap.c | 42 ++++++++++++++++++++++++++++++------------
 1 file changed, 30 insertions(+), 12 deletions(-)

diff --git a/xen/common/bitmap.c b/xen/common/bitmap.c
index 3da63a32a6..d3f9347e62 100644
--- a/xen/common/bitmap.c
+++ b/xen/common/bitmap.c
@@ -52,7 +52,7 @@ static void clamp_last_byte(uint8_t *bp, unsigned int nbits)
        unsigned int remainder = nbits % 8;
 
        if (remainder)
-               bp[nbits/8] &= (1U << remainder) - 1;
+               *bp &= (1U << remainder) - 1;
 }
 
 int __bitmap_empty(const unsigned long *bitmap, unsigned int bits)
@@ -338,7 +338,6 @@ static void bitmap_long_to_byte(uint8_t *bp, const unsigned 
long *lp,
                        nbits -= 8;
                }
        }
-       clamp_last_byte(bp, nbits);
 }
 
 static void bitmap_byte_to_long(unsigned long *lp, const uint8_t *bp,
@@ -363,7 +362,6 @@ static void bitmap_long_to_byte(uint8_t *bp, const unsigned 
long *lp,
                                unsigned int nbits)
 {
        memcpy(bp, lp, DIV_ROUND_UP(nbits, BITS_PER_BYTE));
-       clamp_last_byte(bp, nbits);
 }
 
 static void bitmap_byte_to_long(unsigned long *lp, const uint8_t *bp,
@@ -384,21 +382,41 @@ int bitmap_to_xenctl_bitmap(struct xenctl_bitmap 
*xenctl_bitmap,
     uint8_t zero = 0;
     int err = 0;
     unsigned int xen_bytes = DIV_ROUND_UP(nbits, BITS_PER_BYTE);
-    uint8_t *bytemap = xmalloc_array(uint8_t, xen_bytes);
-
-    if ( !bytemap )
-        return -ENOMEM;
+    uint8_t last;
 
     guest_bytes = DIV_ROUND_UP(xenctl_bitmap->nr_bits, BITS_PER_BYTE);
     copy_bytes  = min(guest_bytes, xen_bytes);
 
-    bitmap_long_to_byte(bytemap, bitmap, nbits);
+    if ( IS_ENABLED(__BIG_ENDIAN) )
+    {
+        uint8_t *bytemap = xmalloc_array(uint8_t, xen_bytes);
 
-    if ( copy_bytes &&
-         copy_to_guest(xenctl_bitmap->bitmap, bytemap, copy_bytes) )
-        err = -EFAULT;
+        if ( !bytemap )
+            return -ENOMEM;
 
-    xfree(bytemap);
+        bitmap_long_to_byte(bytemap, bitmap, nbits);
+        last = bytemap[nbits / 8];
+
+        if ( copy_bytes > 1 &&
+             copy_to_guest(xenctl_bitmap->bitmap, bytemap, copy_bytes - 1) )
+            err = -EFAULT;
+
+        xfree(bytemap);
+    }
+    else
+    {
+        const uint8_t *bytemap = (const uint8_t *)bitmap;
+        last = bytemap[nbits / 8];
+
+        if ( copy_bytes > 1 &&
+             copy_to_guest(xenctl_bitmap->bitmap, bytemap, copy_bytes - 1) )
+            err = -EFAULT;
+    }
+
+    clamp_last_byte(&last, nbits);
+    if ( copy_bytes > 0 &&
+         copy_to_guest_offset(xenctl_bitmap->bitmap, copy_bytes - 1, &last, 1) 
)
+        err = -EFAULT;
 
     for ( i = copy_bytes; !err && i < guest_bytes; i++ )
         if ( copy_to_guest_offset(xenctl_bitmap->bitmap, i, &zero, 1) )
-- 
2.25.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.