bitkeeper revision 1.1236.15.1 (422ed6ffKvpALk9Jv4dfEbnMfU7rPQ)
authorakw27@arcadians.cl.cam.ac.uk <akw27@arcadians.cl.cam.ac.uk>
Wed, 9 Mar 2005 10:59:11 +0000 (10:59 +0000)
committerakw27@arcadians.cl.cam.ac.uk <akw27@arcadians.cl.cam.ac.uk>
Wed, 9 Mar 2005 10:59:11 +0000 (10:59 +0000)
Unmap foreign pages properly.

Signed-off-by: andrew.warfield@cl.cam.ac.uk
linux-2.6.10-xen-sparse/drivers/xen/blktap/blktap_datapath.c
linux-2.6.10-xen-sparse/drivers/xen/blktap/blktap_userdev.c

index dc2c0a739090f12613ba4060feb435bd33c652cb..88360e5ab43c2fd386866ec8211c2f39496a4a8c 100644 (file)
@@ -315,6 +315,7 @@ static int do_block_io_op(blkif_t *blkif, int max_to_do)
          */
         ar = get_active_req();
         ar->id = req_s->id;
+        ar->nr_pages = req_s->nr_segments; 
         blkif_get(blkif);
         ar->blkif = blkif;
         req_s->id = MAKE_ID(blkif->domid, ACTIVE_IDX(ar));
index 9e94f800bf6d3ed5164ec1324c8883afb839589a..3cc307fddf1fe16a562f34708f6f364847da3ac2 100644 (file)
@@ -355,6 +355,24 @@ int blktap_write_be_ring(blkif_response_t *rsp)
     return 0;
 }
 
+static void blktap_fast_flush_area(int idx, int nr_pages)
+{
+    multicall_entry_t mcl[MMAP_PAGES_PER_REQUEST];
+    int               i;
+
+    for ( i = 0; i < nr_pages; i++ )
+    {
+        mcl[i].op = __HYPERVISOR_update_va_mapping;
+        mcl[i].args[0] = MMAP_VADDR(idx, i);
+        mcl[i].args[1] = 0;
+        mcl[i].args[2] = 0;
+    }
+
+    mcl[nr_pages-1].args[2] = UVMF_FLUSH_TLB;
+    if ( unlikely(HYPERVISOR_multicall(mcl, nr_pages) != 0) )
+        BUG();
+}
+
 static int blktap_read_fe_ring(void)
 {
     /* This is called to read responses from the UFE ring. */
@@ -380,6 +398,7 @@ static int blktap_read_fe_ring(void)
             DPRINTK("resp->fe_ring\n");
             ar = lookup_active_req(ID_TO_IDX(resp_s->id));
             blkif = ar->blkif;
+            blktap_fast_flush_area(ID_TO_IDX(resp_s->id), ar->nr_pages);
             write_resp_to_fe_ring(blkif, resp_s);
             kick_fe_domain(blkif);
         }