WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 1/2] xen-gntdev: Fix incorrect use of zero handle

To: konrad.wilk@xxxxxxxxxx
Subject: [Xen-devel] [PATCH 1/2] xen-gntdev: Fix incorrect use of zero handle
From: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
Date: Wed, 23 Feb 2011 08:11:35 -0500
Cc: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Wed, 23 Feb 2011 05:14:03 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
The handle with numeric value 0 is a valid map handle, so it cannot
be used to indicate that a page has not been mapped. Use -1 instead.

Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
---
 drivers/xen/gntdev.c |   23 ++++++++++++++++-------
 1 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
index 2a4733c..cdc28dc 100644
--- a/drivers/xen/gntdev.c
+++ b/drivers/xen/gntdev.c
@@ -126,6 +126,8 @@ static struct grant_map *gntdev_alloc_map(struct 
gntdev_priv *priv, int count)
                add->pages[i] = alloc_page(GFP_KERNEL | __GFP_HIGHMEM);
                if (add->pages[i] == NULL)
                        goto err;
+               add->map_ops[i].handle = -1;
+               add->unmap_ops[i].handle = -1;
        }
 
        add->index = 0;
@@ -248,7 +250,7 @@ static int find_grant_ptes(pte_t *pte, pgtable_t token,
                          map->grants[pgnr].ref,
                          map->grants[pgnr].domid);
        gnttab_set_unmap_op(&map->unmap_ops[pgnr], pte_maddr, flags,
-                           0 /* handle */);
+                           -1 /* handle */);
        return 0;
 }
 
@@ -259,7 +261,7 @@ static int map_grant_pages(struct grant_map *map)
 
        if (!use_ptemod) {
                /* Note: it could already be mapped */
-               if (map->map_ops[0].handle)
+               if (map->map_ops[0].handle != -1)
                        return 0;
                for (i = 0; i < map->count; i++) {
                        addr = (phys_addr_t)
@@ -268,7 +270,7 @@ static int map_grant_pages(struct grant_map *map)
                                map->grants[i].ref,
                                map->grants[i].domid);
                        gnttab_set_unmap_op(&map->unmap_ops[i], addr,
-                               map->flags, 0 /* handle */);
+                               map->flags, -1 /* handle */);
                }
        }
 
@@ -280,7 +282,11 @@ static int map_grant_pages(struct grant_map *map)
        for (i = 0; i < map->count; i++) {
                if (map->map_ops[i].status)
                        err = -EINVAL;
-               map->unmap_ops[i].handle = map->map_ops[i].handle;
+               else {
+                       BUG_ON(map->map_ops[i].handle == -1);
+                       map->unmap_ops[i].handle = map->map_ops[i].handle;
+                       pr_debug("map handle=%d\n", map->map_ops[i].handle);
+               }
        }
        return err;
 }
@@ -313,7 +319,10 @@ static int __unmap_grant_pages(struct grant_map *map, int 
offset, int pages)
        for (i = 0; i < pages; i++) {
                if (map->unmap_ops[offset+i].status)
                        err = -EINVAL;
-               map->unmap_ops[offset+i].handle = 0;
+               pr_debug("unmap handle=%d st=%d\n",
+                       map->unmap_ops[offset+i].handle,
+                       map->unmap_ops[offset+i].status);
+               map->unmap_ops[offset+i].handle = -1;
        }
        return err;
 }
@@ -328,13 +337,13 @@ static int unmap_grant_pages(struct grant_map *map, int 
offset, int pages)
         * already unmapped some of the grants. Only unmap valid ranges.
         */
        while (pages && !err) {
-               while (pages && !map->unmap_ops[offset].handle) {
+               while (pages && map->unmap_ops[offset].handle == -1) {
                        offset++;
                        pages--;
                }
                range = 0;
                while (range < pages) {
-                       if (!map->unmap_ops[offset+range].handle) {
+                       if (map->unmap_ops[offset+range].handle == -1) {
                                range--;
                                break;
                        }
-- 
1.7.3.4


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>