|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v10 6/8] xen/arm: introduce GNTTABOP_cache_flush
>>> On 21.10.14 at 20:10, <stefano.stabellini@xxxxxxxxxxxxx> wrote:
> @@ -490,6 +495,43 @@ static int _set_status(unsigned gt_version,
> return _set_status_v2(domid, readonly, mapflag, shah, act, status);
> }
>
> +static int grant_map_exists(const struct domain *ld,
> + struct grant_table *rgt,
> + unsigned long mfn,
> + unsigned int *ref_count)
> +{
> + const struct active_grant_entry *act;
> + grant_ref_t ref, max_iter;
These should now be unsigned int too.
> @@ -2488,16 +2530,119 @@
> gnttab_swap_grant_ref(XEN_GUEST_HANDLE_PARAM(gnttab_swap_grant_ref_t) uop,
> return 0;
> }
>
> +static int __gnttab_cache_flush(gnttab_cache_flush_t *cflush,
> + unsigned int *ref_count)
> +{
> + struct domain *d, *owner;
> + struct page_info *page;
> + unsigned long mfn;
> + void *v;
> + int ret = 0;
This initializer ought to be pointless, but isn't because...
> +
> + if ( (cflush->offset >= PAGE_SIZE) ||
> + (cflush->length > PAGE_SIZE) ||
> + (cflush->offset + cflush->length > PAGE_SIZE) )
> + return -EINVAL;
> +
> + if ( cflush->length == 0 || cflush->op == 0 )
> + return 0;
> +
> + /* currently unimplemented */
> + if ( cflush->op & GNTTAB_CACHE_SOURCE_GREF )
> + return -EOPNOTSUPP;
... the check that ->op has no other flags set than the three
supported ones got lost (at least I think it was there earlier on,
and it certainly needs to be there).
> +
> + d = rcu_lock_current_domain();
> + mfn = cflush->a.dev_bus_addr >> PAGE_SHIFT;
> +
> + if ( !mfn_valid(mfn) )
> + {
> + rcu_unlock_domain(d);
> + return -EINVAL;
> + }
> +
> + page = mfn_to_page(mfn);
> + owner = page_get_owner_and_reference(page);
> + if ( !owner )
> + {
> + rcu_unlock_domain(d);
> + return -EPERM;
> + }
> +
> + if ( d != owner )
> + {
> + spin_lock(&owner->grant_table->lock);
> +
> + ret = grant_map_exists(d, owner->grant_table, mfn, ref_count);
> + if ( ret != 0 )
> + {
> + spin_unlock(&owner->grant_table->lock);
> + rcu_unlock_domain(d);
> + put_page(page);
> + return ret;
> + }
> + }
> +
> + v = map_domain_page(mfn);
> + v += cflush->offset;
> +
> + if ( (cflush->op & GNTTAB_CACHE_INVAL) && (cflush->op &
> GNTTAB_CACHE_CLEAN) )
> + ret = clean_and_invalidate_dcache_va_range(v, cflush->length);
> + else if ( cflush->op & GNTTAB_CACHE_INVAL )
> + ret = invalidate_dcache_va_range(v, cflush->length);
> + else if ( cflush->op & GNTTAB_CACHE_CLEAN )
> + ret = clean_dcache_va_range(v, cflush->length);
else
BUG();
> +
> + if ( d != owner )
> + spin_unlock(&owner->grant_table->lock);
> + unmap_domain_page(v);
> + put_page(page);
> +
> + return ret;
> +}
> +
> +static long
> +gnttab_cache_flush(XEN_GUEST_HANDLE_PARAM(gnttab_cache_flush_t) uop,
> + unsigned int *ref_count,
> + unsigned int count)
> +{
> + int ret = 0;
This initializer is pointless (and the variable could be moved into the
inner loop, with the result of __gnttab_cache_flush() being its
initializer).
> + unsigned int i;
> + gnttab_cache_flush_t op;
> +
> + for ( i = 0; i < count; i++ )
> + {
> + if ( i && hypercall_preempt_check() )
> + return i;
> + if ( unlikely(__copy_from_guest(&op, uop, 1)) )
> + return -EFAULT;
> + do {
> + ret = __gnttab_cache_flush(&op, ref_count);
> + if ( ret < 0 )
> + return ret;
> + if ( ret > 0 && hypercall_preempt_check() )
> + return i;
> + } while ( ret > 0 );
> + *ref_count = 0;
> + guest_handle_add_offset(uop, 1);
> + }
> + return 0;
> +}
> +
> +
> long
There are still two blank lines being added here instead of just one.
> @@ -2617,17 +2762,33 @@ do_grant_table_op(
> }
> break;
> }
> + case GNTTABOP_cache_flush:
> + {
> + XEN_GUEST_HANDLE_PARAM(gnttab_cache_flush_t) cflush =
> + guest_handle_cast(uop, gnttab_cache_flush_t);
I think I overlooked this earlier - there ought to be a blank line here
(even if most/all other pre-existing cases have the same issue).
> +struct gnttab_cache_flush {
> + union {
> + /* dev_bus_addr must refer to a granted page and match a
> + * previously returned dev_bus_addr by a GNTTABOP hypercall.
> + * As a consequence dev_bus_addr has to be page aligned.
> + */
As said before, I'm not sure the comment is that useful. But if you
add it, it ought to follow ./CODING_STYLE (of course the first
character in this specific case doesn't need to be upper case). Also
the trailing "... by a GNTTABOP hypercall" reads a little odd to me,
but maybe that's just because my English is lacking.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |