[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8 13/15] xen: make grant resource limits per domain
On 20/09/17 12:34, Jan Beulich wrote: >>>> On 20.09.17 at 08:34, <jgross@xxxxxxxx> wrote: >> --- a/xen/common/compat/grant_table.c >> +++ b/xen/common/compat/grant_table.c >> @@ -157,21 +157,14 @@ int compat_grant_table_op(unsigned int cmd, >> unsigned int max_frame_list_size_in_page = >> (COMPAT_ARG_XLAT_SIZE - sizeof(*nat.setup)) / >> sizeof(*nat.setup->frame_list.p); >> - if ( max_frame_list_size_in_page < max_grant_frames ) > > The latest here, but perhaps even earlier I think max_grant_frames > should become static, so one can be reasonably certain that all other > references are gone. Patch 14 removes the last references, so I can't do it earlier. >> @@ -290,8 +293,8 @@ num_act_frames_from_sha_frames(const unsigned int num) >> return DIV_ROUND_UP(num * sha_per_page, ACGNT_PER_PAGE); >> } >> >> -#define max_nr_active_grant_frames \ >> - num_act_frames_from_sha_frames(max_grant_frames) >> +#define max_nr_active_grant_frames(gt) \ >> + num_act_frames_from_sha_frames(gt->max_grant_frames) > > Parentheses around gt please. Okay. >> @@ -1718,8 +1724,9 @@ gnttab_grow_table(struct domain *d, unsigned int >> req_nr_frames) >> ASSERT(gt->active); >> >> if ( req_nr_frames < INITIAL_NR_GRANT_FRAMES ) >> - req_nr_frames = INITIAL_NR_GRANT_FRAMES; >> - ASSERT(req_nr_frames <= max_grant_frames); >> + req_nr_frames = min_t(unsigned int, INITIAL_NR_GRANT_FRAMES, >> + gt->max_grant_frames); > > Perhaps give the INITIAL_NR_GRANT_FRAMES value a U suffix > instead of using min_t() here? Okay. >> @@ -1777,13 +1784,15 @@ active_alloc_failed: >> >> static long >> gnttab_setup_table( >> - XEN_GUEST_HANDLE_PARAM(gnttab_setup_table_t) uop, unsigned int count) >> + XEN_GUEST_HANDLE_PARAM(gnttab_setup_table_t) uop, unsigned int count, >> + unsigned int limit_max) >> { >> struct vcpu *curr = current; >> struct gnttab_setup_table op; >> struct domain *d = NULL; >> struct grant_table *gt; >> unsigned int i; >> + long ret = 0; > > Wouldn't int suffice here? I just followed the return type of the function. I think this way is cleaner, but in case you like int better I can change it. >> @@ -1819,6 +1819,21 @@ gnttab_setup_table( >> gt = d->grant_table; >> grant_write_lock(gt); >> >> + if ( unlikely(op.nr_frames > gt->max_grant_frames) ) >> + { >> + gdprintk(XENLOG_INFO, "Domain is limited to %d grant-table >> frames.\n", > > %u and you also want to log the subject domain ID (which may not > be current's; same for the other log message below as well as the > similar one in gnttab_get_status_frames()). Okay. >> + gt->max_grant_frames); >> + op.status = GNTST_general_error; >> + goto unlock; >> + } >> + if ( unlikely(limit_max < gt->max_grant_frames) ) > > With the check moved here it can be relaxed afaict: Code below > only writes op.nr_frames entries (same then again for > gnttab_get_status_frames()). Okay. >> @@ -1852,10 +1867,10 @@ gnttab_setup_table( >> if ( d ) >> rcu_unlock_domain(d); >> >> - if ( unlikely(__copy_field_to_guest(uop, &op, status)) ) >> + if ( !ret && unlikely(__copy_field_to_guest(uop, &op, status)) ) > > I wonder whether it wouldn't be better to switch that check > producing -EINVAL to also report the failure in op.status, now > that it lives here (same then for gnttab_get_status_frames() > once again). Okay. >> static long >> gnttab_get_status_frames(XEN_GUEST_HANDLE_PARAM(gnttab_get_status_frames_t) >> uop, >> - int count) >> + int count, unsigned int limit_max) > > Take the opportunity and switch count to unsigned int? Okay. >> @@ -3320,7 +3347,7 @@ do_grant_table_op( >> >> case GNTTABOP_setup_table: >> rc = gnttab_setup_table( >> - guest_handle_cast(uop, gnttab_setup_table_t), count); >> + guest_handle_cast(uop, gnttab_setup_table_t), count, ~0); > > UINT_MAX? Yes. >> @@ -3442,6 +3469,8 @@ grant_table_create( >> /* Simple stuff. */ >> percpu_rwlock_resource_init(&t->lock, grant_rwlock); >> spin_lock_init(&t->maptrack_lock); >> + t->max_grant_frames = max_grant_frames; >> + t->max_maptrack_frames = max_maptrack_frames; > > This together with ... > >> @@ -3655,7 +3686,11 @@ int grant_table_set_limits(struct domain *d, unsigned >> int grant_frames, >> >> /* Set limits. */ >> if ( !gt->active ) >> + { >> + gt->max_grant_frames = grant_frames; >> + gt->max_maptrack_frames = maptrack_frames; >> ret = grant_table_init(gt); >> + } > > .. this raises the question of whether it is legal to decrease the > limits. There may be code depending on it only ever growing. Before grant_table_init() has been called there is no problem decreasing the limits, as nothing depending on them has been setup yet. > Additionally to take the input values without applying some > upper cap - while we have XSA-77, we still shouldn't introduce > new issues making disaggregation more unsafe. Perhaps the > global limits could serve as a cap here? I thought about a cap and TBH I'm not sure which would be sane to apply. The global limits seem wrong, especially looking at patch 14: those limits will be for dom0 only then. And dom0 won't need many grant frames in the normal case... So I could make up a cap in form of either a configurable constant (CONFIG_* or boot parameter?) or as a fraction of domain memory. Any preferences here? >> --- a/xen/include/asm-arm/grant_table.h >> +++ b/xen/include/asm-arm/grant_table.h >> @@ -26,8 +26,8 @@ static inline int replace_grant_supported(void) >> return 1; >> } >> >> -#define gnttab_init_arch(gt) \ >> - ( ((gt)->arch.gfn = xzalloc_array(gfn_t, max_grant_frames)) == 0 \ >> +#define gnttab_init_arch(gt) \ >> + ( ((gt)->arch.gfn = xzalloc_array(gfn_t, (gt)->max_grant_frames)) == 0 \ > > Mind switching to use NULL at this occasion? I'll change it in patch 12 then. Juergen _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |