From: Paul Durrant <Paul.Durrant@citrix.com>
To: 'Jan Beulich' <JBeulich@suse.com>
Cc: Stefano Stabellini <sstabellini@kernel.org>,
Wei Liu <wei.liu2@citrix.com>,
Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
Andrew Cooper <Andrew.Cooper3@citrix.com>,
"Tim (Xen.org)" <tim@xen.org>,
George Dunlap <George.Dunlap@citrix.com>,
Ian Jackson <Ian.Jackson@citrix.com>,
xen-devel <xen-devel@lists.xenproject.org>
Subject: Re: [PATCH v6 07/14] x86: add iommu_op to query reserved ranges
Date: Tue, 11 Sep 2018 09:34:58 +0000 [thread overview]
Message-ID: <8e0a44bbe7f74eecb3ae7d62f9fb1604@AMSPEX02CL03.citrite.net> (raw)
In-Reply-To: <5B925A8902000078001E6525@prv1-mh.provo.novell.com>
> -----Original Message-----
> From: Jan Beulich [mailto:JBeulich@suse.com]
> Sent: 07 September 2018 12:01
> To: Paul Durrant <Paul.Durrant@citrix.com>
> Cc: Andrew Cooper <Andrew.Cooper3@citrix.com>; Wei Liu
> <wei.liu2@citrix.com>; George Dunlap <George.Dunlap@citrix.com>; Ian
> Jackson <Ian.Jackson@citrix.com>; Stefano Stabellini
> <sstabellini@kernel.org>; xen-devel <xen-devel@lists.xenproject.org>;
> Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>; Tim (Xen.org)
> <tim@xen.org>
> Subject: Re: [PATCH v6 07/14] x86: add iommu_op to query reserved ranges
>
> >>> On 23.08.18 at 11:47, <paul.durrant@citrix.com> wrote:
> > This patch adds an iommu_op to allow the domain IOMMU reserved
> ranges to be
> > queried by the guest.
> >
> > NOTE: The number of reserved ranges is determined by system firmware,
> in
> > conjunction with Xen command line options, and is expected to be
> > small. Thus, to avoid over-complicating the code, there is no
> > pre-emption check within the operation.
>
> Hmm, RMRRs reportedly can cover a fair part of (the entire?) frame
> buffer of a graphics device.
That would still be phrased as a single range though, right?
>
> > @@ -100,16 +176,27 @@ long do_iommu_op(unsigned int nr_bufs,
> > return rc;
> > }
> >
> > +CHECK_iommu_reserved_range;
> > +
> > int compat_one_iommu_op(compat_iommu_op_buf_t *buf)
> > {
> > - compat_iommu_op_t cmp;
> > + compat_iommu_op_t cmp = {};
> > + size_t offset;
> > + static const size_t op_size[] = {
> > + [XEN_IOMMUOP_query_reserved] = sizeof(struct
> compat_iommu_op_query_reserved),
> > + };
> > + size_t size;
> > xen_iommu_op_t nat;
> > + unsigned int u;
> > + int32_t status;
> > int rc;
> >
> > - if ( buf->size < sizeof(cmp) )
> > + offset = offsetof(struct compat_iommu_op, u);
> > +
> > + if ( buf->size < offset )
> > return -EFAULT;
>
> For some reason I notice this only now and here - -EFAULT isn't
> really appropriately describing the error condition here. -ENODATA
> or -ENOBUFS perhaps?
Ok. ENODATA seems best.
>
> > @@ -119,17 +206,82 @@ int
> compat_one_iommu_op(compat_iommu_op_buf_t *buf)
> > if ( rc )
> > return rc;
> >
> > + if ( cmp.op >= ARRAY_SIZE(op_size) )
> > + return -EOPNOTSUPP;
> > +
> > + size = op_size[array_index_nospec(cmp.op, ARRAY_SIZE(op_size))];
> > + if ( buf->size < offset + size )
> > + return -EFAULT;
> > +
> > + if ( copy_from_compat_offset((void *)&cmp.u, buf->h, offset, size) )
> > + return -EFAULT;
> > +
> > + /*
> > + * The xlat magic doesn't quite know how to handle the union so
> > + * we need to fix things up here.
> > + */
> > +#define XLAT_iommu_op_u_query_reserved
> XEN_IOMMUOP_query_reserved
> > + u = cmp.op;
> > +
> > +#define XLAT_iommu_op_query_reserved_HNDL_ranges(_d_, _s_)
> \
> > + do \
> > + { \
> > + if ( !compat_handle_is_null((_s_)->ranges) ) \
> > + { \
> > + unsigned int *nr_entries = COMPAT_ARG_XLAT_VIRT_BASE; \
>
> uint32_t (see below) or perhaps even better typeof().
>
Ok.
> > + xen_iommu_reserved_range_t *ranges = \
> > + (void *)(nr_entries + 1); \
> > + \
> > + if ( sizeof(*nr_entries) + \
> > + (sizeof(*ranges) * (_s_)->nr_entries) > \
> > + COMPAT_ARG_XLAT_SIZE ) \
> > + return -E2BIG; \
> > + \
> > + *nr_entries = (_s_)->nr_entries; \
> > + set_xen_guest_handle((_d_)->ranges, ranges); \
> > + } \
> > + else \
> > + set_xen_guest_handle((_d_)->ranges, NULL); \
> > + } while (false)
> > +
> > XLAT_iommu_op(&nat, &cmp);
> >
> > +#undef XLAT_iommu_op_query_reserved_HNDL_ranges
> > +
> > iommu_op(&nat);
> >
> > + status = nat.status;
> > +
> > +#define XLAT_iommu_op_query_reserved_HNDL_ranges(_d_, _s_)
> \
> > + do \
> > + { \
> > + if ( !compat_handle_is_null((_d_)->ranges) ) \
> > + { \
> > + unsigned int *nr_entries = COMPAT_ARG_XLAT_VIRT_BASE; \
> > + compat_iommu_reserved_range_t *ranges = \
> > + (void *)(nr_entries + 1); \
> > + unsigned int nr = \
> > + min_t(unsigned int, (_d_)->nr_entries, *nr_entries); \
> > + \
> > + if ( __copy_to_compat_offset((_d_)->ranges, 0, ranges, nr) ) \
> > + status = -EFAULT; \
> > + } \
> > + } while (false)
> > +
> > XLAT_iommu_op(&cmp, &nat);
> >
> > + /* status will have been modified if __copy_to_compat_offset() failed
> */
> > + cmp.status = status;
> > +
> > +#undef XLAT_iommu_op_query_reserved_HNDL_ranges
> > +
> > if ( __copy_field_to_compat(compat_handle_cast(buf->h,
> > compat_iommu_op_t),
> > &cmp, status) )
> > return -EFAULT;
> >
> > +#undef XLAT_iommu_op_u_query_reserved
> > +
> > return 0;
> > }
>
> It's somehow more evident here, but I think even on the native path
> the nr_entries field doesn't get copied back despite it being an OUT.
Indeed. It would be so much simpler just to copy back the entire buf to avoid the need to special-case this for each op.
>
> > --- a/xen/include/public/iommu_op.h
> > +++ b/xen/include/public/iommu_op.h
> > @@ -25,11 +25,50 @@
> >
> > #include "xen.h"
> >
> > +typedef uint64_t xen_bfn_t;
> > +
> > +/* Structure describing a single range reserved in the IOMMU */
> > +struct xen_iommu_reserved_range {
> > + xen_bfn_t start_bfn;
> > + unsigned int nr_frames;
> > + unsigned int pad;
>
> uint32_t
Ok.
>
> > +};
> > +typedef struct xen_iommu_reserved_range
> xen_iommu_reserved_range_t;
> > +DEFINE_XEN_GUEST_HANDLE(xen_iommu_reserved_range_t);
> > +
> > +/*
> > + * XEN_IOMMUOP_query_reserved: Query ranges reserved in the
> IOMMU.
> > + */
>
> Single line comment please.
>
Ok.
> > +#define XEN_IOMMUOP_query_reserved 1
> > +
> > +struct xen_iommu_op_query_reserved {
> > + /*
> > + * IN/OUT - On entry this is the number of entries available
> > + * in the ranges array below.
> > + * On exit this is the actual number of reserved ranges.
> > + */
> > + unsigned int nr_entries;
> > + unsigned int pad;
>
> uint32_t
>
Ok.
Paul
> Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2018-09-11 9:35 UTC|newest]
Thread overview: 111+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-23 9:46 [PATCH v6 00/14] paravirtual IOMMU interface Paul Durrant
2018-08-23 9:46 ` [PATCH v6 01/14] iommu: introduce the concept of BFN Paul Durrant
2018-08-30 15:59 ` Jan Beulich
2018-09-03 8:23 ` Paul Durrant
2018-09-03 11:46 ` Jan Beulich
2018-09-04 6:48 ` Tian, Kevin
2018-09-04 8:32 ` Jan Beulich
2018-09-04 8:37 ` Tian, Kevin
2018-09-04 8:47 ` Jan Beulich
2018-09-04 8:49 ` Paul Durrant
2018-09-04 9:08 ` Jan Beulich
2018-09-05 0:42 ` Tian, Kevin
2018-09-05 6:48 ` Jan Beulich
2018-09-05 6:56 ` Tian, Kevin
2018-09-05 7:11 ` Jan Beulich
2018-09-05 9:13 ` Paul Durrant
2018-09-05 9:38 ` Jan Beulich
2018-09-06 10:36 ` Paul Durrant
2018-09-06 13:13 ` Jan Beulich
2018-09-06 14:54 ` Paul Durrant
2018-09-07 1:47 ` Tian, Kevin
2018-09-07 6:24 ` Jan Beulich
2018-09-07 8:13 ` Paul Durrant
2018-09-07 8:16 ` Tian, Kevin
2018-09-07 8:25 ` Paul Durrant
2018-08-23 9:46 ` [PATCH v6 02/14] iommu: make use of type-safe BFN and MFN in exported functions Paul Durrant
2018-09-04 10:29 ` Jan Beulich
2018-08-23 9:47 ` [PATCH v6 03/14] iommu: push use of type-safe BFN and MFN into iommu_ops Paul Durrant
2018-09-04 10:32 ` Jan Beulich
2018-08-23 9:47 ` [PATCH v6 04/14] iommu: don't domain_crash() inside iommu_map/unmap_page() Paul Durrant
2018-09-04 10:38 ` Jan Beulich
2018-09-04 10:39 ` Paul Durrant
2018-08-23 9:47 ` [PATCH v6 05/14] public / x86: introduce __HYPERCALL_iommu_op Paul Durrant
2018-09-04 11:50 ` Jan Beulich
2018-09-04 12:23 ` Paul Durrant
2018-09-04 12:55 ` Jan Beulich
2018-09-04 13:17 ` Paul Durrant
2018-09-07 10:52 ` Jan Beulich
2018-08-23 9:47 ` [PATCH v6 06/14] iommu: track reserved ranges using a rangeset Paul Durrant
2018-09-07 10:40 ` Jan Beulich
2018-09-11 9:28 ` Paul Durrant
2018-08-23 9:47 ` [PATCH v6 07/14] x86: add iommu_op to query reserved ranges Paul Durrant
2018-09-07 11:01 ` Jan Beulich
2018-09-11 9:34 ` Paul Durrant [this message]
2018-09-11 9:43 ` Jan Beulich
2018-09-13 6:11 ` Tian, Kevin
2018-08-23 9:47 ` [PATCH v6 08/14] vtd: add lookup_page method to iommu_ops Paul Durrant
2018-09-07 11:11 ` Jan Beulich
2018-09-07 12:36 ` Paul Durrant
2018-09-07 14:56 ` Jan Beulich
2018-09-07 15:24 ` Paul Durrant
2018-09-07 15:52 ` Jan Beulich
2018-09-12 8:31 ` Paul Durrant
2018-09-12 8:43 ` Jan Beulich
2018-09-12 8:45 ` Paul Durrant
2018-09-12 8:51 ` Paul Durrant
2018-09-12 8:53 ` Paul Durrant
2018-09-12 9:03 ` Jan Beulich
2018-09-12 9:05 ` Paul Durrant
2018-09-12 9:12 ` Jan Beulich
2018-09-12 9:15 ` Paul Durrant
2018-09-12 9:21 ` Jan Beulich
2018-09-12 9:30 ` Paul Durrant
2018-09-12 10:07 ` Jan Beulich
2018-09-12 10:09 ` Paul Durrant
2018-09-12 12:15 ` Jan Beulich
2018-09-12 12:22 ` Paul Durrant
2018-09-12 12:39 ` Jan Beulich
2018-09-12 12:53 ` Paul Durrant
2018-09-12 13:19 ` Jan Beulich
2018-09-12 13:25 ` Paul Durrant
2018-09-12 13:39 ` Jan Beulich
2018-09-12 13:43 ` Paul Durrant
2018-09-12 8:59 ` Jan Beulich
2018-08-23 9:47 ` [PATCH v6 09/14] mm / iommu: include need_iommu() test in iommu_use_hap_pt() Paul Durrant
2018-09-07 11:20 ` Jan Beulich
2018-09-11 9:39 ` Paul Durrant
2018-09-11 9:47 ` Jan Beulich
2018-09-13 6:23 ` Tian, Kevin
2018-09-13 8:34 ` Paul Durrant
2018-08-23 9:47 ` [PATCH v6 10/14] mm / iommu: split need_iommu() into has_iommu_pt() and need_iommu_pt_sync() Paul Durrant
2018-08-23 11:10 ` Razvan Cojocaru
2018-09-11 14:31 ` Jan Beulich
2018-09-11 15:40 ` Paul Durrant
2018-09-12 6:45 ` Jan Beulich
2018-09-12 8:07 ` Paul Durrant
2018-08-23 9:47 ` [PATCH v6 11/14] x86: add iommu_op to enable modification of IOMMU mappings Paul Durrant
2018-09-11 14:48 ` Jan Beulich
2018-09-11 15:52 ` Paul Durrant
2018-09-12 6:53 ` Jan Beulich
2018-09-12 8:04 ` Paul Durrant
2018-08-23 9:47 ` [PATCH v6 12/14] memory: add get_paged_gfn() as a wrapper Paul Durrant
2018-08-23 10:24 ` Julien Grall
2018-08-23 10:30 ` Paul Durrant
2018-09-11 14:56 ` Jan Beulich
2018-09-12 9:10 ` Paul Durrant
2018-09-12 9:15 ` Jan Beulich
2018-09-12 10:01 ` George Dunlap
2018-09-12 10:08 ` Paul Durrant
2018-09-12 10:10 ` Jan Beulich
2018-08-23 9:47 ` [PATCH v6 13/14] x86: add iommu_ops to modify and flush IOMMU mappings Paul Durrant
2018-09-11 15:15 ` Jan Beulich
2018-09-12 7:03 ` Jan Beulich
2018-09-12 8:02 ` Paul Durrant
2018-09-12 8:27 ` Jan Beulich
2018-09-13 6:41 ` Tian, Kevin
2018-09-13 8:32 ` Paul Durrant
2018-09-13 8:49 ` Jan Beulich
2018-08-23 9:47 ` [PATCH v6 14/14] x86: extend the map and unmap iommu_ops to support grant references Paul Durrant
2018-09-12 14:12 ` Jan Beulich
2018-09-12 16:28 ` Paul Durrant
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8e0a44bbe7f74eecb3ae7d62f9fb1604@AMSPEX02CL03.citrite.net \
--to=paul.durrant@citrix.com \
--cc=Andrew.Cooper3@citrix.com \
--cc=George.Dunlap@citrix.com \
--cc=Ian.Jackson@citrix.com \
--cc=JBeulich@suse.com \
--cc=konrad.wilk@oracle.com \
--cc=sstabellini@kernel.org \
--cc=tim@xen.org \
--cc=wei.liu2@citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).