From nobody Thu Apr 18 11:23:04 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail(p=none dis=none) header.from=oracle.com ARC-Seal: i=1; a=rsa-sha256; t=1557422952; cv=none; d=zoho.com; s=zohoarc; b=Fu2IB2o5+wkxLDYe9r+LfoH7+gldWYmQmSlb4A7Ie8TGONeuuqJZuQsdODdjnS9frIKDqk89G9/JtpxkXxQUk4mnQYaAxIJLKWG9PvLBqWIGqlL2R9zzgLuD9CNm3WTca7bbpgoTAGrvtBPGKzllgalx7uC+Hog53W07TXHTQ7Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1557422952; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=99F4j3l/PLGsDwVR8AbCjB8kQGbZmex1H078ly0msrI=; b=iixDJ2sY2wQljWzH0eL/lDc4xLJVQDLHzcELaWQgiyd6wpTrx0JePpQv5XsbDiowoFi804eSJnewfCJI5sxsi8ePcBTdOBAqnh7shd8NdMUnnwUXH41gYgaZvOPTaWaPJ97Ispi6WRDMt4ojzTFg7OGO23CZpTzcQWIl+qXYFg0= ARC-Authentication-Results: i=1; mx.zoho.com; dkim=fail; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1557422952663859.8061151010443; Thu, 9 May 2019 10:29:12 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hOmpl-0001qM-MU; Thu, 09 May 2019 17:27:53 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57] helo=us1-amaz-eas2.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hOmpl-0001q2-AR for xen-devel@lists.xenproject.org; Thu, 09 May 2019 17:27:53 +0000 Received: from aserp2130.oracle.com (unknown [141.146.126.79]) by us1-amaz-eas2.inumbo.com (Halon) with ESMTPS id c539ccac-727f-11e9-ac13-7fd1f1f1a5a2; Thu, 09 May 2019 17:27:50 +0000 (UTC) Received: from pps.filterd (aserp2130.oracle.com [127.0.0.1]) by aserp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x49HJMt2162236; Thu, 9 May 2019 17:27:49 GMT Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by aserp2130.oracle.com with ESMTP id 2s94b6cf9s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 09 May 2019 17:27:49 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x49HNxqa109565; Thu, 9 May 2019 17:25:48 GMT Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by userp3030.oracle.com with ESMTP id 2sagyvcg73-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 09 May 2019 17:25:48 +0000 Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id x49HPlha019366; Thu, 9 May 2019 17:25:47 GMT Received: from aa1-ca-oracle-com.ca.oracle.com (/10.156.75.204) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 09 May 2019 10:25:47 -0700 X-Inumbo-ID: c539ccac-727f-11e9-ac13-7fd1f1f1a5a2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding; s=corp-2018-07-02; bh=FvwJdH247VIR+T7d8TULPFfutaAeqdcje9WExwJ1RHc=; b=fesHRt605BuU7kaQjJ33JtffhGU3oVjx2bxIZ9mfdG91NgEWIx/1+mU9UWZtlJFS9iyf VGGdqwyyHULxcM+K/tsFE7hiSuv8WT+oBtvY6kb3epYjI07oH5lHqwpaL2FsTzFIJdjo Sm9yjcncu7QSNhdQuUInprQ39Ns7I/HkcaP9RR8HucQg+ri3KXLpM53+u2TYCqBOILVt oojaxNmtyEzMNzCsTHmSS1ZKPVQQJHXXXZzmIUu7ztx0WWoFPOWugfLtEN32IxrEu54F JHGpbSI5IrM8G9l0bPz2bIxsntzximkwF7olKmmQhWSl9KnaUOsZhNcnyz1axZ5rE5jg /w== From: Ankur Arora To: linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org Date: Thu, 9 May 2019 10:25:39 -0700 Message-Id: <20190509172540.12398-16-ankur.a.arora@oracle.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190509172540.12398-1-ankur.a.arora@oracle.com> References: <20190509172540.12398-1-ankur.a.arora@oracle.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=9252 signatures=668686 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=2 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1905090100 X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=9252 signatures=668686 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1905090100 Subject: [Xen-devel] [RFC PATCH 15/16] xen/net: gnttab, evtchn, xenbus API changes X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: jgross@suse.com, sstabellini@kernel.org, konrad.wilk@oracle.com, ankur.a.arora@oracle.com, pbonzini@redhat.com, boris.ostrovsky@oracle.com, joao.m.martins@oracle.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) For the most part, we now pass xenhost_t * as parameter. Co-developed-by: Joao Martins Signed-off-by: Ankur Arora --- drivers/net/xen-netback/hash.c | 7 +- drivers/net/xen-netback/interface.c | 7 +- drivers/net/xen-netback/netback.c | 11 +-- drivers/net/xen-netback/rx.c | 3 +- drivers/net/xen-netback/xenbus.c | 81 +++++++++++----------- drivers/net/xen-netfront.c | 102 +++++++++++++++------------- 6 files changed, 117 insertions(+), 94 deletions(-) diff --git a/drivers/net/xen-netback/hash.c b/drivers/net/xen-netback/hash.c index 0ccb021f1e78..93a449571ef3 100644 --- a/drivers/net/xen-netback/hash.c +++ b/drivers/net/xen-netback/hash.c @@ -289,6 +289,8 @@ u32 xenvif_set_hash_flags(struct xenvif *vif, u32 flags) u32 xenvif_set_hash_key(struct xenvif *vif, u32 gref, u32 len) { u8 *key =3D vif->hash.key; + struct xenbus_device *dev =3D xenvif_to_xenbus_device(vif); + struct gnttab_copy copy_op =3D { .source.u.ref =3D gref, .source.domid =3D vif->domid, @@ -303,7 +305,7 @@ u32 xenvif_set_hash_key(struct xenvif *vif, u32 gref, u= 32 len) return XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER; =20 if (copy_op.len !=3D 0) { - gnttab_batch_copy(©_op, 1); + gnttab_batch_copy(dev->xh, ©_op, 1); =20 if (copy_op.status !=3D GNTST_okay) return XEN_NETIF_CTRL_STATUS_INVALID_PARAMETER; @@ -334,6 +336,7 @@ u32 xenvif_set_hash_mapping(struct xenvif *vif, u32 gre= f, u32 len, u32 off) { u32 *mapping =3D vif->hash.mapping[!vif->hash.mapping_sel]; + struct xenbus_device *dev =3D xenvif_to_xenbus_device(vif); unsigned int nr =3D 1; struct gnttab_copy copy_op[2] =3D {{ .source.u.ref =3D gref, @@ -363,7 +366,7 @@ u32 xenvif_set_hash_mapping(struct xenvif *vif, u32 gre= f, u32 len, vif->hash.size * sizeof(*mapping)); =20 if (copy_op[0].len !=3D 0) { - gnttab_batch_copy(copy_op, nr); + gnttab_batch_copy(dev->xh, copy_op, nr); =20 if (copy_op[0].status !=3D GNTST_okay || copy_op[nr - 1].status !=3D GNTST_okay) diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/= interface.c index 53d4e6351f1e..329a4c701042 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -519,6 +519,7 @@ struct xenvif *xenvif_alloc(struct device *parent, domi= d_t domid, int xenvif_init_queue(struct xenvif_queue *queue) { int err, i; + struct xenbus_device *dev =3D xenvif_to_xenbus_device(queue->vif); =20 queue->credit_bytes =3D queue->remaining_credit =3D ~0UL; queue->credit_usec =3D 0UL; @@ -542,7 +543,7 @@ int xenvif_init_queue(struct xenvif_queue *queue) * better enable it. The long term solution would be to use just a * bunch of valid page descriptors, without dependency on ballooning */ - err =3D gnttab_alloc_pages(MAX_PENDING_REQS, + err =3D gnttab_alloc_pages(dev->xh, MAX_PENDING_REQS, queue->mmap_pages); if (err) { netdev_err(queue->vif->dev, "Could not reserve mmap_pages\n"); @@ -790,7 +791,9 @@ void xenvif_disconnect_ctrl(struct xenvif *vif) */ void xenvif_deinit_queue(struct xenvif_queue *queue) { - gnttab_free_pages(MAX_PENDING_REQS, queue->mmap_pages); + struct xenbus_device *dev =3D xenvif_to_xenbus_device(queue->vif); + + gnttab_free_pages(dev->xh, MAX_PENDING_REQS, queue->mmap_pages); } =20 void xenvif_free(struct xenvif *vif) diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/ne= tback.c index 80aae3a32c2a..055de62ecbf5 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c @@ -1244,6 +1244,7 @@ static inline void xenvif_tx_dealloc_action(struct xe= nvif_queue *queue) pending_ring_idx_t dc, dp; u16 pending_idx, pending_idx_release[MAX_PENDING_REQS]; unsigned int i =3D 0; + struct xenbus_device *dev =3D xenvif_to_xenbus_device(queue->vif); =20 dc =3D queue->dealloc_cons; gop =3D queue->tx_unmap_ops; @@ -1280,7 +1281,7 @@ static inline void xenvif_tx_dealloc_action(struct xe= nvif_queue *queue) =20 if (gop - queue->tx_unmap_ops > 0) { int ret; - ret =3D gnttab_unmap_refs(queue->tx_unmap_ops, + ret =3D gnttab_unmap_refs(dev->xh, queue->tx_unmap_ops, NULL, queue->pages_to_unmap, gop - queue->tx_unmap_ops); @@ -1310,6 +1311,7 @@ int xenvif_tx_action(struct xenvif_queue *queue, int = budget) { unsigned nr_mops, nr_cops =3D 0; int work_done, ret; + struct xenbus_device *dev =3D xenvif_to_xenbus_device(queue->vif); =20 if (unlikely(!tx_work_todo(queue))) return 0; @@ -1319,9 +1321,9 @@ int xenvif_tx_action(struct xenvif_queue *queue, int = budget) if (nr_cops =3D=3D 0) return 0; =20 - gnttab_batch_copy(queue->tx_copy_ops, nr_cops); + gnttab_batch_copy(dev->xh, queue->tx_copy_ops, nr_cops); if (nr_mops !=3D 0) { - ret =3D gnttab_map_refs(queue->tx_map_ops, + ret =3D gnttab_map_refs(dev->xh, queue->tx_map_ops, NULL, queue->pages_to_map, nr_mops); @@ -1391,6 +1393,7 @@ void xenvif_idx_unmap(struct xenvif_queue *queue, u16= pending_idx) { int ret; struct gnttab_unmap_grant_ref tx_unmap_op; + struct xenbus_device *dev =3D xenvif_to_xenbus_device(queue->vif); =20 gnttab_set_unmap_op(&tx_unmap_op, idx_to_kaddr(queue, pending_idx), @@ -1398,7 +1401,7 @@ void xenvif_idx_unmap(struct xenvif_queue *queue, u16= pending_idx) queue->grant_tx_handle[pending_idx]); xenvif_grant_handle_reset(queue, pending_idx); =20 - ret =3D gnttab_unmap_refs(&tx_unmap_op, NULL, + ret =3D gnttab_unmap_refs(dev->xh, &tx_unmap_op, NULL, &queue->mmap_pages[pending_idx], 1); if (ret) { netdev_err(queue->vif->dev, diff --git a/drivers/net/xen-netback/rx.c b/drivers/net/xen-netback/rx.c index ef5887037b22..aa8fcbe315a6 100644 --- a/drivers/net/xen-netback/rx.c +++ b/drivers/net/xen-netback/rx.c @@ -134,8 +134,9 @@ static void xenvif_rx_copy_flush(struct xenvif_queue *q= ueue) { unsigned int i; int notify; + struct xenbus_device *dev =3D xenvif_to_xenbus_device(queue->vif); =20 - gnttab_batch_copy(queue->rx_copy.op, queue->rx_copy.num); + gnttab_batch_copy(dev->xh, queue->rx_copy.op, queue->rx_copy.num); =20 for (i =3D 0; i < queue->rx_copy.num; i++) { struct gnttab_copy *op; diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xen= bus.c index 2625740bdc4a..09316c221db9 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c @@ -257,7 +257,7 @@ static int netback_remove(struct xenbus_device *dev) if (be->vif) { kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE); xen_unregister_watchers(be->vif); - xenbus_rm(XBT_NIL, dev->nodename, "hotplug-status"); + xenbus_rm(dev->xh, XBT_NIL, dev->nodename, "hotplug-status"); xenvif_free(be->vif); be->vif =3D NULL; } @@ -299,26 +299,26 @@ static int netback_probe(struct xenbus_device *dev, sg =3D 1; =20 do { - err =3D xenbus_transaction_start(&xbt); + err =3D xenbus_transaction_start(dev->xh, &xbt); if (err) { xenbus_dev_fatal(dev, err, "starting transaction"); goto fail; } =20 - err =3D xenbus_printf(xbt, dev->nodename, "feature-sg", "%d", sg); + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "feature-sg", "%d", s= g); if (err) { message =3D "writing feature-sg"; goto abort_transaction; } =20 - err =3D xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4", + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "feature-gso-tcpv4", "%d", sg); if (err) { message =3D "writing feature-gso-tcpv4"; goto abort_transaction; } =20 - err =3D xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv6", + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "feature-gso-tcpv6", "%d", sg); if (err) { message =3D "writing feature-gso-tcpv6"; @@ -326,7 +326,7 @@ static int netback_probe(struct xenbus_device *dev, } =20 /* We support partial checksum setup for IPv6 packets */ - err =3D xenbus_printf(xbt, dev->nodename, + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "feature-ipv6-csum-offload", "%d", 1); if (err) { @@ -335,7 +335,7 @@ static int netback_probe(struct xenbus_device *dev, } =20 /* We support rx-copy path. */ - err =3D xenbus_printf(xbt, dev->nodename, + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "feature-rx-copy", "%d", 1); if (err) { message =3D "writing feature-rx-copy"; @@ -346,7 +346,7 @@ static int netback_probe(struct xenbus_device *dev, * We don't support rx-flip path (except old guests who don't * grok this feature flag). */ - err =3D xenbus_printf(xbt, dev->nodename, + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "feature-rx-flip", "%d", 0); if (err) { message =3D "writing feature-rx-flip"; @@ -354,14 +354,14 @@ static int netback_probe(struct xenbus_device *dev, } =20 /* We support dynamic multicast-control. */ - err =3D xenbus_printf(xbt, dev->nodename, + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "feature-multicast-control", "%d", 1); if (err) { message =3D "writing feature-multicast-control"; goto abort_transaction; } =20 - err =3D xenbus_printf(xbt, dev->nodename, + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "feature-dynamic-multicast-control", "%d", 1); if (err) { @@ -369,7 +369,7 @@ static int netback_probe(struct xenbus_device *dev, goto abort_transaction; } =20 - err =3D xenbus_transaction_end(xbt, 0); + err =3D xenbus_transaction_end(dev->xh, xbt, 0); } while (err =3D=3D -EAGAIN); =20 if (err) { @@ -381,25 +381,25 @@ static int netback_probe(struct xenbus_device *dev, * Split event channels support, this is optional so it is not * put inside the above loop. */ - err =3D xenbus_printf(XBT_NIL, dev->nodename, + err =3D xenbus_printf(dev->xh, XBT_NIL, dev->nodename, "feature-split-event-channels", "%u", separate_tx_rx_irq); if (err) pr_debug("Error writing feature-split-event-channels\n"); =20 /* Multi-queue support: This is an optional feature. */ - err =3D xenbus_printf(XBT_NIL, dev->nodename, + err =3D xenbus_printf(dev->xh, XBT_NIL, dev->nodename, "multi-queue-max-queues", "%u", xenvif_max_queues); if (err) pr_debug("Error writing multi-queue-max-queues\n"); =20 - err =3D xenbus_printf(XBT_NIL, dev->nodename, + err =3D xenbus_printf(dev->xh, XBT_NIL, dev->nodename, "feature-ctrl-ring", "%u", true); if (err) pr_debug("Error writing feature-ctrl-ring\n"); =20 - script =3D xenbus_read(XBT_NIL, dev->nodename, "script", NULL); + script =3D xenbus_read(dev->xh, XBT_NIL, dev->nodename, "script", NULL); if (IS_ERR(script)) { err =3D PTR_ERR(script); xenbus_dev_fatal(dev, err, "reading script"); @@ -417,7 +417,7 @@ static int netback_probe(struct xenbus_device *dev, return 0; =20 abort_transaction: - xenbus_transaction_end(xbt, 1); + xenbus_transaction_end(dev->xh, xbt, 1); xenbus_dev_fatal(dev, err, "%s", message); fail: pr_debug("failed\n"); @@ -459,7 +459,7 @@ static int backend_create_xenvif(struct backend_info *b= e) if (be->vif !=3D NULL) return 0; =20 - err =3D xenbus_scanf(XBT_NIL, dev->nodename, "handle", "%li", &handle); + err =3D xenbus_scanf(dev->xh, XBT_NIL, dev->nodename, "handle", "%li", &h= andle); if (err !=3D 1) { xenbus_dev_fatal(dev, err, "reading handle"); return (err < 0) ? err : -EINVAL; @@ -680,7 +680,7 @@ static void xen_net_read_rate(struct xenbus_device *dev, *bytes =3D ~0UL; *usec =3D 0; =20 - ratestr =3D xenbus_read(XBT_NIL, dev->nodename, "rate", NULL); + ratestr =3D xenbus_read(dev->xh, XBT_NIL, dev->nodename, "rate", NULL); if (IS_ERR(ratestr)) return; =20 @@ -710,7 +710,7 @@ static int xen_net_read_mac(struct xenbus_device *dev, = u8 mac[]) char *s, *e, *macstr; int i; =20 - macstr =3D s =3D xenbus_read(XBT_NIL, dev->nodename, "mac", NULL); + macstr =3D s =3D xenbus_read(dev->xh, XBT_NIL, dev->nodename, "mac", NULL= ); if (IS_ERR(macstr)) return PTR_ERR(macstr); =20 @@ -765,7 +765,7 @@ static int xen_register_credit_watch(struct xenbus_devi= ce *dev, snprintf(node, maxlen, "%s/rate", dev->nodename); vif->credit_watch.node =3D node; vif->credit_watch.callback =3D xen_net_rate_changed; - err =3D register_xenbus_watch(&vif->credit_watch); + err =3D register_xenbus_watch(dev->xh, &vif->credit_watch); if (err) { pr_err("Failed to set watcher %s\n", vif->credit_watch.node); kfree(node); @@ -777,8 +777,9 @@ static int xen_register_credit_watch(struct xenbus_devi= ce *dev, =20 static void xen_unregister_credit_watch(struct xenvif *vif) { + struct xenbus_device *dev =3D xenvif_to_xenbus_device(vif); if (vif->credit_watch.node) { - unregister_xenbus_watch(&vif->credit_watch); + unregister_xenbus_watch(dev->xh, &vif->credit_watch); kfree(vif->credit_watch.node); vif->credit_watch.node =3D NULL; } @@ -791,7 +792,7 @@ static void xen_mcast_ctrl_changed(struct xenbus_watch = *watch, mcast_ctrl_watch); struct xenbus_device *dev =3D xenvif_to_xenbus_device(vif); =20 - vif->multicast_control =3D !!xenbus_read_unsigned(dev->otherend, + vif->multicast_control =3D !!xenbus_read_unsigned(dev->xh, dev->otherend, "request-multicast-control", 0); } =20 @@ -817,7 +818,7 @@ static int xen_register_mcast_ctrl_watch(struct xenbus_= device *dev, dev->otherend); vif->mcast_ctrl_watch.node =3D node; vif->mcast_ctrl_watch.callback =3D xen_mcast_ctrl_changed; - err =3D register_xenbus_watch(&vif->mcast_ctrl_watch); + err =3D register_xenbus_watch(dev->xh, &vif->mcast_ctrl_watch); if (err) { pr_err("Failed to set watcher %s\n", vif->mcast_ctrl_watch.node); @@ -830,8 +831,10 @@ static int xen_register_mcast_ctrl_watch(struct xenbus= _device *dev, =20 static void xen_unregister_mcast_ctrl_watch(struct xenvif *vif) { + struct xenbus_device *dev =3D xenvif_to_xenbus_device(vif); + if (vif->mcast_ctrl_watch.node) { - unregister_xenbus_watch(&vif->mcast_ctrl_watch); + unregister_xenbus_watch(dev->xh, &vif->mcast_ctrl_watch); kfree(vif->mcast_ctrl_watch.node); vif->mcast_ctrl_watch.node =3D NULL; } @@ -853,7 +856,7 @@ static void xen_unregister_watchers(struct xenvif *vif) static void unregister_hotplug_status_watch(struct backend_info *be) { if (be->have_hotplug_status_watch) { - unregister_xenbus_watch(&be->hotplug_status_watch); + unregister_xenbus_watch(be->dev->xh, &be->hotplug_status_watch); kfree(be->hotplug_status_watch.node); } be->have_hotplug_status_watch =3D 0; @@ -869,7 +872,7 @@ static void hotplug_status_changed(struct xenbus_watch = *watch, char *str; unsigned int len; =20 - str =3D xenbus_read(XBT_NIL, be->dev->nodename, "hotplug-status", &len); + str =3D xenbus_read(be->dev->xh, XBT_NIL, be->dev->nodename, "hotplug-sta= tus", &len); if (IS_ERR(str)) return; if (len =3D=3D sizeof("connected")-1 && !memcmp(str, "connected", len)) { @@ -891,14 +894,14 @@ static int connect_ctrl_ring(struct backend_info *be) unsigned int evtchn; int err; =20 - err =3D xenbus_scanf(XBT_NIL, dev->otherend, + err =3D xenbus_scanf(dev->xh, XBT_NIL, dev->otherend, "ctrl-ring-ref", "%u", &val); if (err < 0) goto done; /* The frontend does not have a control ring */ =20 ring_ref =3D val; =20 - err =3D xenbus_scanf(XBT_NIL, dev->otherend, + err =3D xenbus_scanf(dev->xh, XBT_NIL, dev->otherend, "event-channel-ctrl", "%u", &val); if (err < 0) { xenbus_dev_fatal(dev, err, @@ -936,7 +939,7 @@ static void connect(struct backend_info *be) /* Check whether the frontend requested multiple queues * and read the number requested. */ - requested_num_queues =3D xenbus_read_unsigned(dev->otherend, + requested_num_queues =3D xenbus_read_unsigned(dev->xh, dev->otherend, "multi-queue-num-queues", 1); if (requested_num_queues > xenvif_max_queues) { /* buggy or malicious guest */ @@ -1087,7 +1090,7 @@ static int connect_data_rings(struct backend_info *be, queue->id); } =20 - err =3D xenbus_gather(XBT_NIL, xspath, + err =3D xenbus_gather(dev->xh, XBT_NIL, xspath, "tx-ring-ref", "%lu", &tx_ring_ref, "rx-ring-ref", "%lu", &rx_ring_ref, NULL); if (err) { @@ -1098,11 +1101,11 @@ static int connect_data_rings(struct backend_info *= be, } =20 /* Try split event channels first, then single event channel. */ - err =3D xenbus_gather(XBT_NIL, xspath, + err =3D xenbus_gather(dev->xh, XBT_NIL, xspath, "event-channel-tx", "%u", &tx_evtchn, "event-channel-rx", "%u", &rx_evtchn, NULL); if (err < 0) { - err =3D xenbus_scanf(XBT_NIL, xspath, + err =3D xenbus_scanf(dev->xh, XBT_NIL, xspath, "event-channel", "%u", &tx_evtchn); if (err < 0) { xenbus_dev_fatal(dev, err, @@ -1137,7 +1140,7 @@ static int read_xenbus_vif_flags(struct backend_info = *be) unsigned int rx_copy; int err; =20 - err =3D xenbus_scanf(XBT_NIL, dev->otherend, "request-rx-copy", "%u", + err =3D xenbus_scanf(dev->xh, XBT_NIL, dev->otherend, "request-rx-copy", = "%u", &rx_copy); if (err =3D=3D -ENOENT) { err =3D 0; @@ -1151,7 +1154,7 @@ static int read_xenbus_vif_flags(struct backend_info = *be) if (!rx_copy) return -EOPNOTSUPP; =20 - if (!xenbus_read_unsigned(dev->otherend, "feature-rx-notify", 0)) { + if (!xenbus_read_unsigned(dev->xh, dev->otherend, "feature-rx-notify", 0)= ) { /* - Reduce drain timeout to poll more frequently for * Rx requests. * - Disable Rx stall detection. @@ -1160,20 +1163,20 @@ static int read_xenbus_vif_flags(struct backend_inf= o *be) be->vif->stall_timeout =3D 0; } =20 - vif->can_sg =3D !!xenbus_read_unsigned(dev->otherend, "feature-sg", 0); + vif->can_sg =3D !!xenbus_read_unsigned(dev->xh, dev->otherend, "feature-s= g", 0); =20 vif->gso_mask =3D 0; =20 - if (xenbus_read_unsigned(dev->otherend, "feature-gso-tcpv4", 0)) + if (xenbus_read_unsigned(dev->xh, dev->otherend, "feature-gso-tcpv4", 0)) vif->gso_mask |=3D GSO_BIT(TCPV4); =20 - if (xenbus_read_unsigned(dev->otherend, "feature-gso-tcpv6", 0)) + if (xenbus_read_unsigned(dev->xh, dev->otherend, "feature-gso-tcpv6", 0)) vif->gso_mask |=3D GSO_BIT(TCPV6); =20 - vif->ip_csum =3D !xenbus_read_unsigned(dev->otherend, + vif->ip_csum =3D !xenbus_read_unsigned(dev->xh, dev->otherend, "feature-no-csum-offload", 0); =20 - vif->ipv6_csum =3D !!xenbus_read_unsigned(dev->otherend, + vif->ipv6_csum =3D !!xenbus_read_unsigned(dev->xh, dev->otherend, "feature-ipv6-csum-offload", 0); =20 return 0; diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index ee28e8b85406..71007ad822c0 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c @@ -285,6 +285,7 @@ static void xennet_alloc_rx_buffers(struct netfront_que= ue *queue) RING_IDX req_prod =3D queue->rx.req_prod_pvt; int notify; int err =3D 0; + struct xenbus_device *dev =3D queue->info->xbdev; =20 if (unlikely(!netif_carrier_ok(queue->info->netdev))) return; @@ -309,14 +310,14 @@ static void xennet_alloc_rx_buffers(struct netfront_q= ueue *queue) BUG_ON(queue->rx_skbs[id]); queue->rx_skbs[id] =3D skb; =20 - ref =3D gnttab_claim_grant_reference(&queue->gref_rx_head); + ref =3D gnttab_claim_grant_reference(dev->xh, &queue->gref_rx_head); WARN_ON_ONCE(IS_ERR_VALUE((unsigned long)(int)ref)); queue->grant_rx_ref[id] =3D ref; =20 page =3D skb_frag_page(&skb_shinfo(skb)->frags[0]); =20 req =3D RING_GET_REQUEST(&queue->rx, req_prod); - gnttab_page_grant_foreign_access_ref_one(ref, + gnttab_page_grant_foreign_access_ref_one(dev->xh, ref, queue->info->xbdev->otherend_id, page, 0); @@ -377,6 +378,7 @@ static void xennet_tx_buf_gc(struct netfront_queue *que= ue) unsigned short id; struct sk_buff *skb; bool more_to_do; + struct xenbus_device *dev =3D queue->info->xbdev; =20 BUG_ON(!netif_carrier_ok(queue->info->netdev)); =20 @@ -393,15 +395,15 @@ static void xennet_tx_buf_gc(struct netfront_queue *q= ueue) =20 id =3D txrsp->id; skb =3D queue->tx_skbs[id].skb; - if (unlikely(gnttab_query_foreign_access( + if (unlikely(gnttab_query_foreign_access(dev->xh, queue->grant_tx_ref[id]) !=3D 0)) { pr_alert("%s: warning -- grant still in use by backend domain\n", __func__); BUG(); } - gnttab_end_foreign_access_ref( + gnttab_end_foreign_access_ref(dev->xh, queue->grant_tx_ref[id], GNTMAP_readonly); - gnttab_release_grant_reference( + gnttab_release_grant_reference(dev->xh, &queue->gref_tx_head, queue->grant_tx_ref[id]); queue->grant_tx_ref[id] =3D GRANT_INVALID_REF; queue->grant_tx_page[id] =3D NULL; @@ -436,13 +438,14 @@ static void xennet_tx_setup_grant(unsigned long gfn, = unsigned int offset, struct page *page =3D info->page; struct netfront_queue *queue =3D info->queue; struct sk_buff *skb =3D info->skb; + struct xenbus_device *dev =3D queue->info->xbdev; =20 id =3D get_id_from_freelist(&queue->tx_skb_freelist, queue->tx_skbs); tx =3D RING_GET_REQUEST(&queue->tx, queue->tx.req_prod_pvt++); - ref =3D gnttab_claim_grant_reference(&queue->gref_tx_head); + ref =3D gnttab_claim_grant_reference(dev->xh, &queue->gref_tx_head); WARN_ON_ONCE(IS_ERR_VALUE((unsigned long)(int)ref)); =20 - gnttab_grant_foreign_access_ref(ref, queue->info->xbdev->otherend_id, + gnttab_grant_foreign_access_ref(dev->xh, ref, queue->info->xbdev->otheren= d_id, gfn, GNTMAP_readonly); =20 queue->tx_skbs[id].skb =3D skb; @@ -786,6 +789,7 @@ static int xennet_get_responses(struct netfront_queue *= queue, struct xen_netif_rx_response *rx =3D &rinfo->rx; struct xen_netif_extra_info *extras =3D rinfo->extras; struct device *dev =3D &queue->info->netdev->dev; + struct xenbus_device *xdev =3D queue->info->xbdev; RING_IDX cons =3D queue->rx.rsp_cons; struct sk_buff *skb =3D xennet_get_rx_skb(queue, cons); grant_ref_t ref =3D xennet_get_rx_ref(queue, cons); @@ -823,10 +827,10 @@ static int xennet_get_responses(struct netfront_queue= *queue, goto next; } =20 - ret =3D gnttab_end_foreign_access_ref(ref, 0); + ret =3D gnttab_end_foreign_access_ref(xdev->xh, ref, 0); BUG_ON(!ret); =20 - gnttab_release_grant_reference(&queue->gref_rx_head, ref); + gnttab_release_grant_reference(xdev->xh, &queue->gref_rx_head, ref); =20 __skb_queue_tail(list, skb); =20 @@ -1130,6 +1134,7 @@ static void xennet_release_tx_bufs(struct netfront_qu= eue *queue) { struct sk_buff *skb; int i; + struct xenbus_device *dev =3D queue->info->xbdev; =20 for (i =3D 0; i < NET_TX_RING_SIZE; i++) { /* Skip over entries which are actually freelist references */ @@ -1138,7 +1143,7 @@ static void xennet_release_tx_bufs(struct netfront_qu= eue *queue) =20 skb =3D queue->tx_skbs[i].skb; get_page(queue->grant_tx_page[i]); - gnttab_end_foreign_access(queue->grant_tx_ref[i], + gnttab_end_foreign_access(dev->xh, queue->grant_tx_ref[i], GNTMAP_readonly, (unsigned long)page_address(queue->grant_tx_page[i])); queue->grant_tx_page[i] =3D NULL; @@ -1151,6 +1156,7 @@ static void xennet_release_tx_bufs(struct netfront_qu= eue *queue) static void xennet_release_rx_bufs(struct netfront_queue *queue) { int id, ref; + struct xenbus_device *dev =3D queue->info->xbdev; =20 spin_lock_bh(&queue->rx_lock); =20 @@ -1172,7 +1178,7 @@ static void xennet_release_rx_bufs(struct netfront_qu= eue *queue) * foreign access is ended (which may be deferred). */ get_page(page); - gnttab_end_foreign_access(ref, 0, + gnttab_end_foreign_access(dev->xh, ref, 0, (unsigned long)page_address(page)); queue->grant_rx_ref[id] =3D GRANT_INVALID_REF; =20 @@ -1186,22 +1192,23 @@ static netdev_features_t xennet_fix_features(struct= net_device *dev, netdev_features_t features) { struct netfront_info *np =3D netdev_priv(dev); + struct xenbus_device *xdev =3D np->xbdev; =20 if (features & NETIF_F_SG && - !xenbus_read_unsigned(np->xbdev->otherend, "feature-sg", 0)) + !xenbus_read_unsigned(xdev->xh, np->xbdev->otherend, "feature-sg", 0)) features &=3D ~NETIF_F_SG; =20 if (features & NETIF_F_IPV6_CSUM && - !xenbus_read_unsigned(np->xbdev->otherend, + !xenbus_read_unsigned(xdev->xh, np->xbdev->otherend, "feature-ipv6-csum-offload", 0)) features &=3D ~NETIF_F_IPV6_CSUM; =20 if (features & NETIF_F_TSO && - !xenbus_read_unsigned(np->xbdev->otherend, "feature-gso-tcpv4", 0)) + !xenbus_read_unsigned(xdev->xh, np->xbdev->otherend, "feature-gso-tcp= v4", 0)) features &=3D ~NETIF_F_TSO; =20 if (features & NETIF_F_TSO6 && - !xenbus_read_unsigned(np->xbdev->otherend, "feature-gso-tcpv6", 0)) + !xenbus_read_unsigned(xdev->xh, np->xbdev->otherend, "feature-gso-tcp= v6", 0)) features &=3D ~NETIF_F_TSO6; =20 return features; @@ -1375,17 +1382,18 @@ static int netfront_probe(struct xenbus_device *dev, return 0; } =20 -static void xennet_end_access(int ref, void *page) +static void xennet_end_access(xenhost_t *xh, int ref, void *page) { /* This frees the page as a side-effect */ if (ref !=3D GRANT_INVALID_REF) - gnttab_end_foreign_access(ref, 0, (unsigned long)page); + gnttab_end_foreign_access(xh, ref, 0, (unsigned long)page); } =20 static void xennet_disconnect_backend(struct netfront_info *info) { unsigned int i =3D 0; unsigned int num_queues =3D info->netdev->real_num_tx_queues; + struct xenbus_device *dev =3D info->xbdev; =20 netif_carrier_off(info->netdev); =20 @@ -1408,12 +1416,12 @@ static void xennet_disconnect_backend(struct netfro= nt_info *info) =20 xennet_release_tx_bufs(queue); xennet_release_rx_bufs(queue); - gnttab_free_grant_references(queue->gref_tx_head); - gnttab_free_grant_references(queue->gref_rx_head); + gnttab_free_grant_references(dev->xh, queue->gref_tx_head); + gnttab_free_grant_references(dev->xh, queue->gref_rx_head); =20 /* End access and free the pages */ - xennet_end_access(queue->tx_ring_ref, queue->tx.sring); - xennet_end_access(queue->rx_ring_ref, queue->rx.sring); + xennet_end_access(dev->xh, queue->tx_ring_ref, queue->tx.sring); + xennet_end_access(dev->xh, queue->rx_ring_ref, queue->rx.sring); =20 queue->tx_ring_ref =3D GRANT_INVALID_REF; queue->rx_ring_ref =3D GRANT_INVALID_REF; @@ -1443,7 +1451,7 @@ static int xen_net_read_mac(struct xenbus_device *dev= , u8 mac[]) char *s, *e, *macstr; int i; =20 - macstr =3D s =3D xenbus_read(XBT_NIL, dev->nodename, "mac", NULL); + macstr =3D s =3D xenbus_read(dev->xh, XBT_NIL, dev->nodename, "mac", NULL= ); if (IS_ERR(macstr)) return PTR_ERR(macstr); =20 @@ -1588,11 +1596,11 @@ static int setup_netfront(struct xenbus_device *dev, * granted pages because backend is not accessing it at this point. */ alloc_evtchn_fail: - gnttab_end_foreign_access_ref(queue->rx_ring_ref, 0); + gnttab_end_foreign_access_ref(dev->xh, queue->rx_ring_ref, 0); grant_rx_ring_fail: free_page((unsigned long)rxs); alloc_rx_ring_fail: - gnttab_end_foreign_access_ref(queue->tx_ring_ref, 0); + gnttab_end_foreign_access_ref(dev->xh, queue->tx_ring_ref, 0); grant_tx_ring_fail: free_page((unsigned long)txs); fail: @@ -1608,6 +1616,7 @@ static int xennet_init_queue(struct netfront_queue *q= ueue) unsigned short i; int err =3D 0; char *devid; + struct xenbus_device *dev =3D queue->info->xbdev; =20 spin_lock_init(&queue->tx_lock); spin_lock_init(&queue->rx_lock); @@ -1633,7 +1642,7 @@ static int xennet_init_queue(struct netfront_queue *q= ueue) } =20 /* A grant for every tx ring slot */ - if (gnttab_alloc_grant_references(NET_TX_RING_SIZE, + if (gnttab_alloc_grant_references(dev->xh, NET_TX_RING_SIZE, &queue->gref_tx_head) < 0) { pr_alert("can't alloc tx grant refs\n"); err =3D -ENOMEM; @@ -1641,7 +1650,7 @@ static int xennet_init_queue(struct netfront_queue *q= ueue) } =20 /* A grant for every rx ring slot */ - if (gnttab_alloc_grant_references(NET_RX_RING_SIZE, + if (gnttab_alloc_grant_references(dev->xh, NET_RX_RING_SIZE, &queue->gref_rx_head) < 0) { pr_alert("can't alloc rx grant refs\n"); err =3D -ENOMEM; @@ -1651,7 +1660,7 @@ static int xennet_init_queue(struct netfront_queue *q= ueue) return 0; =20 exit_free_tx: - gnttab_free_grant_references(queue->gref_tx_head); + gnttab_free_grant_references(dev->xh, queue->gref_tx_head); exit: return err; } @@ -1685,14 +1694,14 @@ static int write_queue_xenstore_keys(struct netfron= t_queue *queue, } =20 /* Write ring references */ - err =3D xenbus_printf(*xbt, path, "tx-ring-ref", "%u", + err =3D xenbus_printf(dev->xh, *xbt, path, "tx-ring-ref", "%u", queue->tx_ring_ref); if (err) { message =3D "writing tx-ring-ref"; goto error; } =20 - err =3D xenbus_printf(*xbt, path, "rx-ring-ref", "%u", + err =3D xenbus_printf(dev->xh, *xbt, path, "rx-ring-ref", "%u", queue->rx_ring_ref); if (err) { message =3D "writing rx-ring-ref"; @@ -1704,7 +1713,7 @@ static int write_queue_xenstore_keys(struct netfront_= queue *queue, */ if (queue->tx_evtchn =3D=3D queue->rx_evtchn) { /* Shared event channel */ - err =3D xenbus_printf(*xbt, path, + err =3D xenbus_printf(dev->xh,*xbt, path, "event-channel", "%u", queue->tx_evtchn); if (err) { message =3D "writing event-channel"; @@ -1712,14 +1721,14 @@ static int write_queue_xenstore_keys(struct netfron= t_queue *queue, } } else { /* Split event channels */ - err =3D xenbus_printf(*xbt, path, + err =3D xenbus_printf(dev->xh, *xbt, path, "event-channel-tx", "%u", queue->tx_evtchn); if (err) { message =3D "writing event-channel-tx"; goto error; } =20 - err =3D xenbus_printf(*xbt, path, + err =3D xenbus_printf(dev->xh, *xbt, path, "event-channel-rx", "%u", queue->rx_evtchn); if (err) { message =3D "writing event-channel-rx"; @@ -1810,12 +1819,12 @@ static int talk_to_netback(struct xenbus_device *de= v, info->netdev->irq =3D 0; =20 /* Check if backend supports multiple queues */ - max_queues =3D xenbus_read_unsigned(info->xbdev->otherend, + max_queues =3D xenbus_read_unsigned(dev->xh, info->xbdev->otherend, "multi-queue-max-queues", 1); num_queues =3D min(max_queues, xennet_max_queues); =20 /* Check feature-split-event-channels */ - feature_split_evtchn =3D xenbus_read_unsigned(info->xbdev->otherend, + feature_split_evtchn =3D xenbus_read_unsigned(dev->xh, info->xbdev->other= end, "feature-split-event-channels", 0); =20 /* Read mac addr. */ @@ -1847,16 +1856,16 @@ static int talk_to_netback(struct xenbus_device *de= v, } =20 again: - err =3D xenbus_transaction_start(&xbt); + err =3D xenbus_transaction_start(dev->xh, &xbt); if (err) { xenbus_dev_fatal(dev, err, "starting transaction"); goto destroy_ring; } =20 - if (xenbus_exists(XBT_NIL, + if (xenbus_exists(dev->xh, XBT_NIL, info->xbdev->otherend, "multi-queue-max-queues")) { /* Write the number of queues */ - err =3D xenbus_printf(xbt, dev->nodename, + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "multi-queue-num-queues", "%u", num_queues); if (err) { message =3D "writing multi-queue-num-queues"; @@ -1879,45 +1888,45 @@ static int talk_to_netback(struct xenbus_device *de= v, } =20 /* The remaining keys are not queue-specific */ - err =3D xenbus_printf(xbt, dev->nodename, "request-rx-copy", "%u", + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "request-rx-copy", "%u= ", 1); if (err) { message =3D "writing request-rx-copy"; goto abort_transaction; } =20 - err =3D xenbus_printf(xbt, dev->nodename, "feature-rx-notify", "%d", 1); + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "feature-rx-notify", "= %d", 1); if (err) { message =3D "writing feature-rx-notify"; goto abort_transaction; } =20 - err =3D xenbus_printf(xbt, dev->nodename, "feature-sg", "%d", 1); + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "feature-sg", "%d", 1); if (err) { message =3D "writing feature-sg"; goto abort_transaction; } =20 - err =3D xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4", "%d", 1); + err =3D xenbus_printf(dev->xh, xbt, dev->nodename, "feature-gso-tcpv4", "= %d", 1); if (err) { message =3D "writing feature-gso-tcpv4"; goto abort_transaction; } =20 - err =3D xenbus_write(xbt, dev->nodename, "feature-gso-tcpv6", "1"); + err =3D xenbus_write(dev->xh, xbt, dev->nodename, "feature-gso-tcpv6", "1= "); if (err) { message =3D "writing feature-gso-tcpv6"; goto abort_transaction; } =20 - err =3D xenbus_write(xbt, dev->nodename, "feature-ipv6-csum-offload", + err =3D xenbus_write(dev->xh, xbt, dev->nodename, "feature-ipv6-csum-offl= oad", "1"); if (err) { message =3D "writing feature-ipv6-csum-offload"; goto abort_transaction; } =20 - err =3D xenbus_transaction_end(xbt, 0); + err =3D xenbus_transaction_end(dev->xh, xbt, 0); if (err) { if (err =3D=3D -EAGAIN) goto again; @@ -1930,7 +1939,7 @@ static int talk_to_netback(struct xenbus_device *dev, abort_transaction: xenbus_dev_fatal(dev, err, "%s", message); abort_transaction_no_dev_fatal: - xenbus_transaction_end(xbt, 1); + xenbus_transaction_end(dev->xh, xbt, 1); destroy_ring: xennet_disconnect_backend(info); rtnl_lock(); @@ -1949,8 +1958,9 @@ static int xennet_connect(struct net_device *dev) int err; unsigned int j =3D 0; struct netfront_queue *queue =3D NULL; + struct xenbus_device *xdev =3D np->xbdev; =20 - if (!xenbus_read_unsigned(np->xbdev->otherend, "feature-rx-copy", 0)) { + if (!xenbus_read_unsigned(xdev->xh, np->xbdev->otherend, "feature-rx-copy= ", 0)) { dev_info(&dev->dev, "backend does not support copying receive path\n"); return -ENODEV; --=20 2.20.1 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel