From patchwork Wed Sep 7 10:40:59 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paulina Szubarczyk X-Patchwork-Id: 9318899 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id BD80C6077F for ; Wed, 7 Sep 2016 10:43:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B411329212 for ; Wed, 7 Sep 2016 10:43:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A867329226; Wed, 7 Sep 2016 10:43:40 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id CA54C29212 for ; Wed, 7 Sep 2016 10:43:39 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bhaIU-0005Gt-KG; Wed, 07 Sep 2016 10:41:38 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bhaIS-0005GF-Pn for xen-devel@lists.xenproject.org; Wed, 07 Sep 2016 10:41:36 +0000 Received: from [193.109.254.147] by server-7.bemta-6.messagelabs.com id 50/E7-15404-0EEEFC75; Wed, 07 Sep 2016 10:41:36 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrAIsWRWlGSWpSXmKPExsVyMfS6o+79d+f DDRbPk7b4vmUykwOjx+EPV1gCGKNYM/OS8isSWDNezWljKXgVXDFnzwf2BsYLtl2MnBxCAtMZ JbY2KXYxcnGwCLxkkXi68jwLiCMh0M8q0X7zFCtIlYRAjMTyR9PZuhg5gOxyiZ7DxRDNWhKXV q4AqxcSmMMkcfxSAxNIgk3ATGLm5J8sILaIgJLEvVWTweLMAk8YJd6ucQGxhQWcJU63f2EGsV kEVCV+TJ8FtotXwEvi9urDUHvlJE4em8wKspdTwFvi3RwHiL1eEvsPz2SbwCiwgJFhFaNGcWp RWWqRrqGJXlJRZnpGSW5iZo6uoYGZXm5qcXFiempOYlKxXnJ+7iZGYFgxAMEOxusbAw4xSnIw KYnyctw9Hy7El5SfUpmRWJwRX1Sak1p8iFGDg0Ogb83qC4xSLHn5ealKErzz3wLVCRalpqdWp GXmAAMfplSCg0dJhHcTSJq3uCAxtzgzHSJ1itGYY8vva2uZOLZNvbeWSQhskpQ4726QUgGQ0o zSPLhBsIi8xCgrJczLCHSmEE9BalFuZgmq/CtGcQ5GJWFeH5ApPJl5JXD7XgGdwgR0itApsFN KEhFSUg2Mcbsn6F3lDpGJjtbqXRL216ud58fh9+cKGcPdJI5V8RnNC92duEtiT/a72w9Zmb+6 90eVSx+NrLnO37zswwS7FruiHrPZlqaRQa1//qjoM0Sfjr3E58i8cNN0S9Zjml83h667+WSVu CXz+jCLK4HMsTcf6nDv1C2ra95Sf1ZxJ+elnyXeW9KVWIozEg21mIuKEwEkjnvbwwIAAA== X-Env-Sender: paulinaszubarczyk@gmail.com X-Msg-Ref: server-2.tower-27.messagelabs.com!1473244894!5492122!1 X-Originating-IP: [209.85.215.65] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.84; banners=-,-,- X-VirusChecked: Checked Received: (qmail 11989 invoked from network); 7 Sep 2016 10:41:35 -0000 Received: from mail-lf0-f65.google.com (HELO mail-lf0-f65.google.com) (209.85.215.65) by server-2.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 7 Sep 2016 10:41:35 -0000 Received: by mail-lf0-f65.google.com with SMTP id l131so600556lfl.0 for ; Wed, 07 Sep 2016 03:41:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=dV6H77pQyU6w/9WxK9x3NRTTaaxmP+fUox1xoIybdVU=; b=W6aMepJFxguVmmzp90EpTxVHBfGs+DYOtgUTJACtCOuPdLCEZdGR9OUkqHW47o7hQR EruQCWRri3B6KvzVBKS5bEIgsYr+e/osulu9eSA5G2O4tZwOUGYjCFQ5iQAsFEM2pcoc ObXiZRl+Cc2Z4RTogVUJDuKeyT5QGy5SABArSdeDSS0X8JupHKf4dmiqC7aXIltR3XOH M5CQ7qBaXh1xBejxd/Jml33I2HuWLP+wh6CCBnn4nAPZEk0gh6D83tLGFLxCEuBkBmv5 w6KniPSaqUQcZ71OdPB69iHXvEe8d8Xz0x8CxodaAXEHT4AhId3P0WMI0itmy5fiTLQn Pcuw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=dV6H77pQyU6w/9WxK9x3NRTTaaxmP+fUox1xoIybdVU=; b=lrPfqpbRaDkIHBMBWuaQd074bl9pMJcTKs+iRnuXF4GCVicz/P7Sv7a1GD6dlMTgK6 BNeb/eowr6YP7eseqkaGSbT1kzy1s8Soyl3cSWUA6F6Ig5oFyHx3bqLdHqjEA+9Hjinw qteqWgYG5yUiYVWaxu/4VQlFBjsFl1KCHncAtcs6Ap5mONMQs3I03e0brQRn5nTzNPCM HGaJ2tiSjYSK3bEDIzK4UgfJaQvQh26CrR1UvIC/HtohXA50dO6pSp2/VrPhXYbKsxHe lyqN1fmKt4l0wG2WtjHyXbby3V6Ek3iMVqQ+VPtQk86fgV6GSrZSugY+Cx7MDRHxUayt YNSw== X-Gm-Message-State: AE9vXwNCgCs5wgqyHJrLZY7bZBTVlhyxn5NZFMv9D/OeCN2kkeMNk2E6UUWBI1sjQqYklg== X-Received: by 10.25.21.138 with SMTP id 10mr3994798lfv.53.1473244894404; Wed, 07 Sep 2016 03:41:34 -0700 (PDT) Received: from localhost.localdomain (user-94-254-225-11.play-internet.pl. [94.254.225.11]) by smtp.gmail.com with ESMTPSA id d15sm6483979lfg.0.2016.09.07.03.41.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 07 Sep 2016 03:41:33 -0700 (PDT) From: Paulina Szubarczyk To: xen-devel@lists.xenproject.org Date: Wed, 7 Sep 2016 12:40:59 +0200 Message-Id: <1473244860-6072-2-git-send-email-paulinaszubarczyk@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1473244860-6072-1-git-send-email-paulinaszubarczyk@gmail.com> References: <1473244860-6072-1-git-send-email-paulinaszubarczyk@gmail.com> Cc: sstabellini@kernel.org, wei.liu2@citrix.com, Paulina Szubarczyk , ian.jackson@eu.citrix.com, qemu-devel@nongnu.org, david.vrabel@citrix.com, anthony.perard@citrix.com, roger.pau@citrix.com Subject: [Xen-devel] [PATCH v6 1/2] libs/gnttab: introduce grant copy interface X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP In a linux part an ioctl(gntdev, IOCTL_GNTDEV_GRANT_COPY, ..) system call is invoked. In mini-os the operation is yet not implemented. For the OSs that does not implement gnttab the call of the grant copy operation causes abort. Signed-off-by: Paulina Szubarczyk Reviewed-by: David Vrabel --- tools/include/xen-sys/Linux/gntdev.h | 21 ++++++++++ tools/libs/gnttab/Makefile | 2 +- tools/libs/gnttab/gnttab_core.c | 6 +++ tools/libs/gnttab/gnttab_unimp.c | 6 +++ tools/libs/gnttab/include/xengnttab.h | 28 +++++++++++++ tools/libs/gnttab/libxengnttab.map | 5 +++ tools/libs/gnttab/linux.c | 77 +++++++++++++++++++++++++++++++++++ tools/libs/gnttab/minios.c | 6 +++ tools/libs/gnttab/private.h | 4 ++ 9 files changed, 154 insertions(+), 1 deletion(-) diff --git a/tools/include/xen-sys/Linux/gntdev.h b/tools/include/xen-sys/Linux/gntdev.h index caf6fb4..0ca07c9 100644 --- a/tools/include/xen-sys/Linux/gntdev.h +++ b/tools/include/xen-sys/Linux/gntdev.h @@ -147,4 +147,25 @@ struct ioctl_gntdev_unmap_notify { /* Send an interrupt on the indicated event channel */ #define UNMAP_NOTIFY_SEND_EVENT 0x2 +struct ioctl_gntdev_grant_copy_segment { + union { + void *virt; + struct { + uint32_t ref; + uint16_t offset; + uint16_t domid; + } foreign; + } source, dest; + uint16_t len; + uint16_t flags; + int16_t status; +}; + +#define IOCTL_GNTDEV_GRANT_COPY \ +_IOC(_IOC_NONE, 'G', 8, sizeof(struct ioctl_gntdev_grant_copy)) +struct ioctl_gntdev_grant_copy { + unsigned int count; + struct ioctl_gntdev_grant_copy_segment *segments; +}; + #endif /* __LINUX_PUBLIC_GNTDEV_H__ */ diff --git a/tools/libs/gnttab/Makefile b/tools/libs/gnttab/Makefile index af64542..95c2cd8 100644 --- a/tools/libs/gnttab/Makefile +++ b/tools/libs/gnttab/Makefile @@ -2,7 +2,7 @@ XEN_ROOT = $(CURDIR)/../../.. include $(XEN_ROOT)/tools/Rules.mk MAJOR = 1 -MINOR = 0 +MINOR = 1 SHLIB_LDFLAGS += -Wl,--version-script=libxengnttab.map CFLAGS += -Werror -Wmissing-prototypes diff --git a/tools/libs/gnttab/gnttab_core.c b/tools/libs/gnttab/gnttab_core.c index 5d0474d..968c833 100644 --- a/tools/libs/gnttab/gnttab_core.c +++ b/tools/libs/gnttab/gnttab_core.c @@ -113,6 +113,12 @@ int xengnttab_unmap(xengnttab_handle *xgt, void *start_address, uint32_t count) return osdep_gnttab_unmap(xgt, start_address, count); } +int xengnttab_grant_copy(xengnttab_handle *xgt, + uint32_t count, + xengnttab_grant_copy_segment_t *segs) +{ + return osdep_gnttab_grant_copy(xgt, count, segs); +} /* * Local variables: * mode: C diff --git a/tools/libs/gnttab/gnttab_unimp.c b/tools/libs/gnttab/gnttab_unimp.c index b3a4a20..829eced 100644 --- a/tools/libs/gnttab/gnttab_unimp.c +++ b/tools/libs/gnttab/gnttab_unimp.c @@ -78,6 +78,12 @@ int xengnttab_unmap(xengnttab_handle *xgt, void *start_address, uint32_t count) abort(); } +int xengnttab_copy_grant(xengnttab_handle *xgt, + uint32_t count, + xengnttab_copy_grant_segment_t *segs) +{ + abort(); +} /* * Local variables: * mode: C diff --git a/tools/libs/gnttab/include/xengnttab.h b/tools/libs/gnttab/include/xengnttab.h index 0431dcf..35be6c1 100644 --- a/tools/libs/gnttab/include/xengnttab.h +++ b/tools/libs/gnttab/include/xengnttab.h @@ -258,6 +258,34 @@ int xengnttab_unmap(xengnttab_handle *xgt, void *start_address, uint32_t count); int xengnttab_set_max_grants(xengnttab_handle *xgt, uint32_t nr_grants); +struct xengnttab_grant_copy_segment { + union xengnttab_copy_ptr { + void *virt; + struct { + uint32_t ref; + uint16_t offset; + uint16_t domid; + } foreign; + } source, dest; + uint16_t len; + uint16_t flags; + int16_t status; +}; + +typedef struct xengnttab_grant_copy_segment xengnttab_grant_copy_segment_t; + +/** + * Copy memory from or to grant references. The information of each operations + * are contained in 'xengnttab_grant_copy_segment_t'. The @flag value indicate + * the direction of an operation (GNTCOPY_source_gref\GNTCOPY_dest_gref). + * + * For each segment, @virt may cross a page boundary but @offset + @len + * must not exceed XEN_PAGE_SIZE. + */ +int xengnttab_grant_copy(xengnttab_handle *xgt, + uint32_t count, + xengnttab_grant_copy_segment_t *segs); + /* * Grant Sharing Interface (allocating and granting pages to others) */ diff --git a/tools/libs/gnttab/libxengnttab.map b/tools/libs/gnttab/libxengnttab.map index dc737ac..f78da22 100644 --- a/tools/libs/gnttab/libxengnttab.map +++ b/tools/libs/gnttab/libxengnttab.map @@ -21,3 +21,8 @@ VERS_1.0 { xengntshr_unshare; local: *; /* Do not expose anything by default */ }; + +VERS_1.1 { + global: + xengnttab_grant_copy; +} VERS_1.0; diff --git a/tools/libs/gnttab/linux.c b/tools/libs/gnttab/linux.c index 7b0fba4..6bd9bd2 100644 --- a/tools/libs/gnttab/linux.c +++ b/tools/libs/gnttab/linux.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -235,6 +236,82 @@ int osdep_gnttab_unmap(xengnttab_handle *xgt, return 0; } +int osdep_gnttab_grant_copy(xengnttab_handle *xgt, + uint32_t count, + xengnttab_grant_copy_segment_t *segs) +{ + int rc; + int fd = xgt->fd; + struct ioctl_gntdev_grant_copy copy; + + XENGNTTAB_BUILD_BUG_ON(sizeof(struct ioctl_gntdev_grant_copy_segment) != + sizeof(xengnttab_grant_copy_segment_t)); + + XENGNTTAB_BUILD_BUG_ON(__alignof__(struct ioctl_gntdev_grant_copy_segment) != + __alignof__(xengnttab_grant_copy_segment_t)); + + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + source.virt) != + offsetof(xengnttab_grant_copy_segment_t, + source.virt)); + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + source.foreign) != + offsetof(xengnttab_grant_copy_segment_t, + source.foreign)); + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + source.foreign.ref) != + offsetof(xengnttab_grant_copy_segment_t, + source.foreign)); + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + source.foreign.offset) != + offsetof(xengnttab_grant_copy_segment_t, + source.foreign.offset)); + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + source.foreign.domid) != + offsetof(xengnttab_grant_copy_segment_t, + source.foreign.domid)); + + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + dest.virt) != + offsetof(xengnttab_grant_copy_segment_t, + dest.virt)); + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + dest.foreign) != + offsetof(xengnttab_grant_copy_segment_t, + dest.foreign)); + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + dest.foreign.ref) != + offsetof(xengnttab_grant_copy_segment_t, + dest.foreign)); + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + dest.foreign.offset) != + offsetof(xengnttab_grant_copy_segment_t, + dest.foreign.offset)); + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + dest.foreign.domid) != + offsetof(xengnttab_grant_copy_segment_t, + dest.foreign.domid)); + + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + len) != + offsetof(xengnttab_grant_copy_segment_t, len)); + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + flags) != + offsetof(xengnttab_grant_copy_segment_t, flags)); + XENGNTTAB_BUILD_BUG_ON(offsetof(struct ioctl_gntdev_grant_copy_segment, + status) != + offsetof(xengnttab_grant_copy_segment_t, status)); + + copy.segments = (struct ioctl_gntdev_grant_copy_segment *)segs; + copy.count = count; + + rc = ioctl(fd, IOCTL_GNTDEV_GRANT_COPY, ©); + if (rc) + GTERROR(xgt->logger, "ioctl GRANT COPY failed %d ", errno); + + return rc; +} + int osdep_gntshr_open(xengntshr_handle *xgs) { int fd = open(DEVXEN "gntalloc", O_RDWR); diff --git a/tools/libs/gnttab/minios.c b/tools/libs/gnttab/minios.c index 7e04174..0951bc9 100644 --- a/tools/libs/gnttab/minios.c +++ b/tools/libs/gnttab/minios.c @@ -106,6 +106,12 @@ int osdep_gnttab_set_max_grants(xengnttab_handle *xgt, uint32_t count) return ret; } +int osdep_gnttab_grant_copy(xengnttab_handle *xgt, + uint32_t count, + xengnttab_grant_copy_segment_t *segs) +{ + return -1; +} /* * Local variables: * mode: C diff --git a/tools/libs/gnttab/private.h b/tools/libs/gnttab/private.h index 2bdc0f2..f8d234a 100644 --- a/tools/libs/gnttab/private.h +++ b/tools/libs/gnttab/private.h @@ -30,6 +30,10 @@ void *osdep_gnttab_grant_map(xengnttab_handle *xgt, int osdep_gnttab_unmap(xengnttab_handle *xgt, void *start_address, uint32_t count); +int osdep_gnttab_grant_copy(xengnttab_handle *xgt, + uint32_t count, + xengnttab_grant_copy_segment_t *segs); + int osdep_gntshr_open(xengntshr_handle *xgs); int osdep_gntshr_close(xengntshr_handle *xgs);