[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v11 1/8] xen: introduce gnttab_max_frames and gnttab_max_maptrack_frames command line options
Introduce gnttab_max_maptrack_frames: a new Xen command line option to specify the max number of maptrack frames per domain. Deprecate the old gnttab_max_nr_frames and introduce gnttab_max_frames instead, that doesn't affect the maptrack. Keep gnttab_max_nr_frames for compatibility. Rename internally max_nr_grant_frames to max_grant_frames to avoid confusions. Introduce DEFAULT_MAX_MAPTRACK_FRAMES, that is completely independent from max_nr_grant_frames. Remove MAX_MAPTRACK_TO_GRANTS_RATIO that is now only used in one place for compatibility. Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> Acked-by: Jan Beulich <jbeulich@xxxxxxxx> --- Changes in v10: - fix coding style for comments; - move BUILD_BUG_ON closer to where it matters. Changes in v9: - fix coding style for comments; - other style fixes. Changes in v8: - remove unused #include; - set max_nr_grant_frames as __initdata; - set max_grant_frames and max_maptrack_frames as __read_mostly; - fix coding style for comments; - remove MAX_MAPTRACK_TO_GRANTS_RATIO. Changes in v7: - remove 0 initializers; - make max_nr_grant_frames static; - remove preprocessors check on max_nr_grant_frames; - remove double black line; - introduce DEFAULT_MAX_MAPTRACK_FRAMES; - no long lines; - set the new variables independently if the old one is passed as argument. Changes in v6: - change ordering of options in xen-command-line.markdown; - initialize all options to 0, then set the defaults on an initcall depending on what options are used. Changes in v5: - /max_nr_maptrack_frames/max_maptrack_frames/g; - deprecate gnttab_max_nr_frames; - introduce gnttab_max_frames; - rename the max_nr_grant_frames variable to max_grant_frames. --- docs/misc/xen-command-line.markdown | 17 +++++++++- xen/arch/arm/domain.c | 2 +- xen/arch/arm/mm.c | 2 +- xen/arch/x86/mm.c | 2 +- xen/common/compat/grant_table.c | 12 +++---- xen/common/grant_table.c | 62 ++++++++++++++++++++++++----------- xen/include/asm-arm/grant_table.h | 2 +- xen/include/xen/grant_table.h | 4 +-- 8 files changed, 70 insertions(+), 33 deletions(-) diff --git a/docs/misc/xen-command-line.markdown b/docs/misc/xen-command-line.markdown index 28bbaaf..00416af 100644 --- a/docs/misc/xen-command-line.markdown +++ b/docs/misc/xen-command-line.markdown @@ -608,11 +608,26 @@ does not provide VM\_ENTRY\_LOAD\_GUEST\_PAT. Specify the serial parameters for the GDB stub. -### gnttab\_max\_nr\_frames +### gnttab\_max\_frames > `= <integer>` Specify the maximum number of frames per grant table operation. +### gnttab\_max\_maptrack\_frames +> `= <integer>` + +Specify the maximum number of maptrack frames domain. +The default value is 8 times gnttab_max_frames. + +### gnttab\_max\_nr\_frames +> `= <integer>` + +*Deprecated* +Use gnttab\_max\_frames and gnttab\_max\_maptrack\_frames instead. + +Specify the maximum number of frames per grant table operation and the +maximum number of maptrack frames domain. + ### guest\_loglvl > `= <level>[/<rate-limited level>]` where level is `none | error | warning | > info | debug | all` diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index 2b53931..57f09c3 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -409,7 +409,7 @@ struct domain *alloc_domain_struct(void) return NULL; clear_page(d); - d->arch.grant_table_gpfn = xzalloc_array(xen_pfn_t, max_nr_grant_frames); + d->arch.grant_table_gpfn = xzalloc_array(xen_pfn_t, max_grant_frames); return d; } diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 97e5bc39..dd70d81 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -1054,7 +1054,7 @@ int xenmem_add_to_physmap_one( else { if ( (idx >= nr_grant_frames(d->grant_table)) && - (idx < max_nr_grant_frames) ) + (idx < max_grant_frames) ) gnttab_grow_table(d, idx + 1); if ( idx < nr_grant_frames(d->grant_table) ) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 6cd7f45..edd1923 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -4564,7 +4564,7 @@ int xenmem_add_to_physmap_one( else { if ( (idx >= nr_grant_frames(d->grant_table)) && - (idx < max_nr_grant_frames) ) + (idx < max_grant_frames) ) gnttab_grow_table(d, idx + 1); if ( idx < nr_grant_frames(d->grant_table) ) diff --git a/xen/common/compat/grant_table.c b/xen/common/compat/grant_table.c index 7ebbbc1..2dc1e44 100644 --- a/xen/common/compat/grant_table.c +++ b/xen/common/compat/grant_table.c @@ -146,11 +146,11 @@ 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_nr_grant_frames ) + if ( max_frame_list_size_in_page < max_grant_frames ) { gdprintk(XENLOG_WARNING, - "max_nr_grant_frames is too large (%u,%u)\n", - max_nr_grant_frames, max_frame_list_size_in_page); + "max_grant_frames is too large (%u,%u)\n", + max_grant_frames, max_frame_list_size_in_page); rc = -EINVAL; } else @@ -284,11 +284,11 @@ int compat_grant_table_op(unsigned int cmd, break; } if ( max_frame_list_size_in_pages < - grant_to_status_frames(max_nr_grant_frames) ) + grant_to_status_frames(max_grant_frames) ) { gdprintk(XENLOG_WARNING, - "grant_to_status_frames(max_nr_grant_frames) is too large (%u,%u)\n", - grant_to_status_frames(max_nr_grant_frames), + "grant_to_status_frames(max_grant_frames) is too large (%u,%u)\n", + grant_to_status_frames(max_grant_frames), max_frame_list_size_in_pages); rc = -EINVAL; break; diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 23266c3..f9a9b44 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -40,16 +40,27 @@ #include <xsm/xsm.h> #include <asm/flushtlb.h> -#ifndef max_nr_grant_frames -unsigned int max_nr_grant_frames = DEFAULT_MAX_NR_GRANT_FRAMES; +/* + * This option is deprecated, use gnttab_max_frames and + * gnttab_max_maptrack_frames instead. + */ +static unsigned int __initdata max_nr_grant_frames; integer_param("gnttab_max_nr_frames", max_nr_grant_frames); -#endif + +unsigned int __read_mostly max_grant_frames; +integer_param("gnttab_max_frames", max_grant_frames); /* The maximum number of grant mappings is defined as a multiplier of the * maximum number of grant table entries. This defines the multiplier used. * Pretty arbitrary. [POLICY] + * As gnttab_max_nr_frames has been deprecated, this multiplier is deprecated too. + * New options allow to set max_maptrack_frames and + * map_grant_table_frames independently. */ -#define MAX_MAPTRACK_TO_GRANTS_RATIO 8 +#define DEFAULT_MAX_MAPTRACK_FRAMES 256 + +static unsigned int __read_mostly max_maptrack_frames; +integer_param("gnttab_max_maptrack_frames", max_maptrack_frames); /* * The first two members of a grant entry are updated as a combined pair. @@ -102,11 +113,6 @@ nr_maptrack_frames(struct grant_table *t) return t->maptrack_limit / MAPTRACK_PER_PAGE; } -static unsigned inline int max_nr_maptrack_frames(void) -{ - return (max_nr_grant_frames * MAX_MAPTRACK_TO_GRANTS_RATIO); -} - #define MAPTRACK_TAIL (~0u) #define SHGNT_PER_PAGE_V1 (PAGE_SIZE / sizeof(grant_entry_v1_t)) @@ -164,7 +170,7 @@ num_act_frames_from_sha_frames(const unsigned int num) } #define max_nr_active_grant_frames \ - num_act_frames_from_sha_frames(max_nr_grant_frames) + num_act_frames_from_sha_frames(max_grant_frames) static inline unsigned int nr_active_grant_frames(struct grant_table *gt) @@ -271,7 +277,7 @@ get_maptrack_handle( while ( unlikely((handle = __get_maptrack_handle(lgt)) == -1) ) { nr_frames = nr_maptrack_frames(lgt); - if ( nr_frames >= max_nr_maptrack_frames() ) + if ( nr_frames >= max_maptrack_frames ) break; new_mt = alloc_xenheap_page(); @@ -1265,7 +1271,7 @@ gnttab_grow_table(struct domain *d, unsigned int req_nr_frames) struct grant_table *gt = d->grant_table; unsigned int i; - ASSERT(req_nr_frames <= max_nr_grant_frames); + ASSERT(req_nr_frames <= max_grant_frames); gdprintk(XENLOG_INFO, "Expanding dom (%d) grant table from (%d) to (%d) frames.\n", @@ -1338,11 +1344,11 @@ gnttab_setup_table( return -EFAULT; } - if ( unlikely(op.nr_frames > max_nr_grant_frames) ) + if ( unlikely(op.nr_frames > max_grant_frames) ) { gdprintk(XENLOG_INFO, "Xen only supports up to %d grant-table frames" " per domain.\n", - max_nr_grant_frames); + max_grant_frames); op.status = GNTST_general_error; goto out1; } @@ -1377,7 +1383,7 @@ gnttab_setup_table( { gdprintk(XENLOG_INFO, "Expand grant table to %u failed. Current: %u Max: %u\n", - op.nr_frames, nr_grant_frames(gt), max_nr_grant_frames); + op.nr_frames, nr_grant_frames(gt), max_grant_frames); op.status = GNTST_general_error; goto out3; } @@ -1438,7 +1444,7 @@ gnttab_query_size( spin_lock(&d->grant_table->lock); op.nr_frames = nr_grant_frames(d->grant_table); - op.max_nr_frames = max_nr_grant_frames; + op.max_nr_frames = max_grant_frames; op.status = GNTST_okay; spin_unlock(&d->grant_table->lock); @@ -2659,7 +2665,7 @@ grant_table_create( /* Tracking of mapped foreign frames table */ if ( (t->maptrack = xzalloc_array(struct grant_mapping *, - max_nr_maptrack_frames())) == NULL ) + max_maptrack_frames)) == NULL ) goto no_mem_2; if ( (t->maptrack[0] = alloc_xenheap_page()) == NULL ) goto no_mem_3; @@ -2670,7 +2676,7 @@ grant_table_create( t->maptrack[0][i - 1].ref = MAPTRACK_TAIL; /* Shared grant table. */ - if ( (t->shared_raw = xzalloc_array(void *, max_nr_grant_frames)) == NULL ) + if ( (t->shared_raw = xzalloc_array(void *, max_grant_frames)) == NULL ) goto no_mem_3; for ( i = 0; i < INITIAL_NR_GRANT_FRAMES; i++ ) { @@ -2681,7 +2687,7 @@ grant_table_create( /* Status pages for grant table - for version 2 */ t->status = xzalloc_array(grant_status_t *, - grant_to_status_frames(max_nr_grant_frames)); + grant_to_status_frames(max_grant_frames)); if ( t->status == NULL ) goto no_mem_4; @@ -2930,6 +2936,24 @@ static struct keyhandler gnttab_usage_print_all_keyhandler = { static int __init gnttab_usage_init(void) { + if ( max_nr_grant_frames ) + { + printk(XENLOG_WARNING + "gnttab_max_nr_frames is deprecated, use gnttab_max_frames instead\n"); + if ( !max_grant_frames ) + max_grant_frames = max_nr_grant_frames; + BUILD_BUG_ON(DEFAULT_MAX_MAPTRACK_FRAMES < DEFAULT_MAX_NR_GRANT_FRAMES); + if ( !max_maptrack_frames ) + max_maptrack_frames = max_nr_grant_frames * + (DEFAULT_MAX_MAPTRACK_FRAMES / DEFAULT_MAX_NR_GRANT_FRAMES); + } + + if ( !max_grant_frames ) + max_grant_frames = DEFAULT_MAX_NR_GRANT_FRAMES; + + if ( !max_maptrack_frames ) + max_maptrack_frames = DEFAULT_MAX_MAPTRACK_FRAMES; + register_keyhandler('g', &gnttab_usage_print_all_keyhandler); return 0; } diff --git a/xen/include/asm-arm/grant_table.h b/xen/include/asm-arm/grant_table.h index 47147ce..e798880 100644 --- a/xen/include/asm-arm/grant_table.h +++ b/xen/include/asm-arm/grant_table.h @@ -31,7 +31,7 @@ static inline int replace_grant_supported(void) #define gnttab_shared_gmfn(d, t, i) \ ( ((i >= nr_grant_frames(d->grant_table)) && \ - (i < max_nr_grant_frames)) ? 0 : (d->arch.grant_table_gpfn[i])) + (i < max_grant_frames)) ? 0 : (d->arch.grant_table_gpfn[i])) #define gnttab_need_iommu_mapping(d) (is_domain_direct_mapped(d)) diff --git a/xen/include/xen/grant_table.h b/xen/include/xen/grant_table.h index 5941191..32f5786 100644 --- a/xen/include/xen/grant_table.h +++ b/xen/include/xen/grant_table.h @@ -49,10 +49,8 @@ /* Default maximum size of a grant table. [POLICY] */ #define DEFAULT_MAX_NR_GRANT_FRAMES 32 #endif -#ifndef max_nr_grant_frames /* to allow arch to override */ /* The maximum size of a grant table. */ -extern unsigned int max_nr_grant_frames; -#endif +extern unsigned int max_grant_frames; /* * Tracks a mapping of another domain's grant reference. Each domain has a -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |