|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 14/14] x86: extend the map and unmap iommu_ops to support grant references
>>> On 23.08.18 at 11:47, <paul.durrant@xxxxxxxxxx> wrote:
> +int
> +acquire_gref_for_iommu(struct domain *d, grant_ref_t gref,
> + bool readonly, mfn_t *mfn)
> +{
> + struct domain *currd = current->domain;
> + struct grant_table *gt = d->grant_table;
> + grant_entry_header_t *shah;
> + struct active_grant_entry *act;
> + uint16_t *status;
> + int rc;
> +
> + grant_read_lock(gt);
> +
> + rc = -ENOENT;
> + if ( gref > nr_grant_entries(gt) )
>= (also in the release counterpart)
> + goto unlock;
> +
> + act = active_entry_acquire(gt, gref);
> + shah = shared_entry_header(gt, gref);
> + status = ( gt->gt_version == 2 ) ?
Stray blanks. Further down in a similar construct you even omit the
parentheses, which you could as well do here too. Again also below.
> + &status_entry(gt, gref) :
> + &shah->flags;
The whole thing does not fit on a line?
> + rc = -EACCES;
> + if ( (shah->flags & GTF_type_mask) != GTF_permit_access ||
> + (shah->flags & GTF_sub_page) )
> + goto release;
So transitive grants are okay despite there being no special
handling anywhere in the function?
> + rc = -ERANGE;
> + if ( act->pin && ((act->domid != currd->domain_id) ||
> + (act->pin & 0x80808080U) != 0) )
You want to check only two of the four top bits, as you only add in
GNTPIN_dev{r,w}_inc below.
> + goto release;
> +
> + rc = -EINVAL;
> + if ( !act->pin ||
> + (!readonly && !(act->pin & GNTPIN_devw_mask)) ) {
> + if ( _set_status(gt->gt_version, currd->domain_id, readonly,
> + 0, shah, act, status) != GNTST_okay )
> + goto release;
> + }
Please combine the two if()-s.
> + if ( !act->pin )
> + {
> + gfn_t gfn = gt->gt_version == 1 ?
> + _gfn(shared_entry_v1(gt, gref).frame) :
> + _gfn(shared_entry_v2(gt, gref).full_page.frame);
> + struct page_info *page;
> +
> + rc = get_paged_gfn(d, gfn, readonly, NULL, &page);
> + if ( rc )
> + goto clear;
> +
> + act_set_gfn(act, gfn);
> + act->mfn = page_to_mfn(page);
> + act->domid = currd->domain_id;
> + act->start = 0;
> + act->length = PAGE_SIZE;
> + act->is_sub_page = false;
> + act->trans_domain = d;
> + act->trans_gref = gref;
> + }
> + else
> + {
> + ASSERT(mfn_valid(act->mfn));
> + if ( !get_page(mfn_to_page(act->mfn), d) )
> + goto clear;
> + }
Don't you also need to also acquire a write ref here if !readonly?
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |