From: kaf24@firebug.cl.cam.ac.uk Date: Thu, 25 Aug 2005 14:30:06 +0000 (+0000) Subject: Fix grant-ref allocation in netfront. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16844^2~6 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=6e08df4d05043a6c7f95152fe6b1da3d686a12f0;p=xen.git Fix grant-ref allocation in netfront. Signed-off-by: Keir Fraser --- diff --git a/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c b/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c index e03e78a759..63080358d8 100644 --- a/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c +++ b/linux-2.6-xen-sparse/arch/xen/kernel/gnttab.c @@ -34,9 +34,11 @@ EXPORT_SYMBOL(gnttab_grant_foreign_access); +EXPORT_SYMBOL(gnttab_end_foreign_access_ref); EXPORT_SYMBOL(gnttab_end_foreign_access); EXPORT_SYMBOL(gnttab_query_foreign_access); EXPORT_SYMBOL(gnttab_grant_foreign_transfer); +EXPORT_SYMBOL(gnttab_end_foreign_transfer_ref); EXPORT_SYMBOL(gnttab_end_foreign_transfer); EXPORT_SYMBOL(gnttab_alloc_grant_references); EXPORT_SYMBOL(gnttab_free_grant_references); @@ -160,7 +162,7 @@ gnttab_query_foreign_access(grant_ref_t ref) } void -gnttab_end_foreign_access(grant_ref_t ref, int readonly) +gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly) { u16 flags, nflags; @@ -170,7 +172,12 @@ gnttab_end_foreign_access(grant_ref_t ref, int readonly) printk(KERN_ALERT "WARNING: g.e. still in use!\n"); } while ( (nflags = synch_cmpxchg(&shared[ref].flags, flags, 0)) != flags ); +} +void +gnttab_end_foreign_access(grant_ref_t ref, int readonly) +{ + gnttab_end_foreign_access_ref(ref, readonly); put_free_entry(ref); } @@ -201,20 +208,13 @@ gnttab_grant_foreign_transfer_ref(grant_ref_t ref, domid_t domid, } unsigned long -gnttab_end_foreign_transfer(grant_ref_t ref) +gnttab_end_foreign_transfer_ref(grant_ref_t ref) { unsigned long frame = 0; u16 flags; flags = shared[ref].flags; -#ifdef CONFIG_XEN_NETDEV_GRANT_RX - /* - * But can't flags == (GTF_accept_transfer | GTF_transfer_completed) - * if gnttab_donate executes without interruption??? - */ -#else - ASSERT(flags == (GTF_accept_transfer | GTF_transfer_committed)); -#endif + /* * If a transfer is committed then wait for the frame address to appear. * Otherwise invalidate the grant entry against future use. @@ -224,8 +224,14 @@ gnttab_end_foreign_transfer(grant_ref_t ref) while ( unlikely((frame = shared[ref].frame) == 0) ) cpu_relax(); - put_free_entry(ref); + return frame; +} +unsigned long +gnttab_end_foreign_transfer(grant_ref_t ref) +{ + unsigned long frame = gnttab_end_foreign_transfer_ref(ref); + put_free_entry(ref); return frame; } diff --git a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c index 79bafd33ea..26238b7fe6 100644 --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c @@ -363,7 +363,7 @@ static void network_tx_buf_gc(struct net_device *dev) "still in use by backend domain.\n"); goto out; } - gnttab_end_foreign_access(grant_tx_ref[id], GNTMAP_readonly); + gnttab_end_foreign_access_ref(grant_tx_ref[id], GNTMAP_readonly); gnttab_release_grant_reference(&gref_tx_head, grant_tx_ref[id]); grant_tx_ref[id] = GRANT_INVALID_REF; #endif @@ -649,7 +649,7 @@ static int netif_poll(struct net_device *dev, int *pbudget) #ifdef CONFIG_XEN_NETDEV_GRANT_RX ref = grant_rx_ref[rx->id]; grant_rx_ref[rx->id] = GRANT_INVALID_REF; - mfn = gnttab_end_foreign_transfer(ref); + mfn = gnttab_end_foreign_transfer_ref(ref); gnttab_release_grant_reference(&gref_rx_head, ref); #endif diff --git a/linux-2.6-xen-sparse/include/asm-xen/gnttab.h b/linux-2.6-xen-sparse/include/asm-xen/gnttab.h index 5a1f214b16..ab4871e663 100644 --- a/linux-2.6-xen-sparse/include/asm-xen/gnttab.h +++ b/linux-2.6-xen-sparse/include/asm-xen/gnttab.h @@ -30,10 +30,12 @@ struct gnttab_free_callback { int gnttab_grant_foreign_access(domid_t domid, unsigned long frame, int readonly); +void gnttab_end_foreign_access_ref(grant_ref_t ref, int readonly); void gnttab_end_foreign_access(grant_ref_t ref, int readonly); int gnttab_grant_foreign_transfer(domid_t domid, unsigned long pfn); +unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref); unsigned long gnttab_end_foreign_transfer(grant_ref_t ref); int gnttab_query_foreign_access(grant_ref_t ref);