|
|
|
|
|
|
|
|
|
|
xen-devel
Re: [Xen-devel] PATCH: multicall and auto_translated in netfront.c
> diff -r bef360142b62 -r ee4aef404bce
> linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
> --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Mon Aug 14
> 14:21:21 2006 -0600
> +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Fri Aug 18
> 14:00:37 2006 +0200
> @@ -1220,13 +1220,20 @@ err:
>
> /* Do all the remapping work, and M2P updates, in one big hypercall. */
> if (likely(pages_done)) {
> - mcl = np->rx_mcl + pages_done;
> + unsigned int mcl_off;
> +
> + if (!xen_feature(XENFEAT_auto_translated_physmap))
> + mcl_off = pages_done;
> + else
> + mcl_off = 0;
> +
The intent of this code was that pages_done should be 0 if
auto_translated_physmap was set, so this should be a no-op. It gets
initialised to 0 at the top of the big loop, and is then only modified
by xennet_get_responses through its mcl_offset_p pointer.
xennet_get_responses only modifies it if
!xen_feature(XENFEAT_auto_translated_physmap). Am I simply confused?
(And, in fact, if pages_done != 0 then the mmu update you do next will
be incorrect)
> + mcl = np->rx_mcl + mcl_off;
> mcl->op = __HYPERVISOR_mmu_update;
> mcl->args[0] = (unsigned long)np->rx_mmu;
> mcl->args[1] = pages_done;
> mcl->args[2] = 0;
> mcl->args[3] = DOMID_SELF;
> - (void)HYPERVISOR_multicall(np->rx_mcl, pages_done + 1);
> + (void)HYPERVISOR_multicall(np->rx_mcl, mcl_off + 1);
> }
>
> while ((skb = __skb_dequeue(&errq)))
Steven.
signature.asc
Description: Digital signature
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|
|
|