Jan Beulich
2012-Sep-11 11:58 UTC
[PATCH] gnttab: cleanup of number-of-active-frames calculations
max_nr_active_grant_frames() is merly is special case of num_act_frames_from_sha_frames(), so there''s no need to have a special case implementation for it. Further, some of the related definitions (including the "struct active_grant_entry" definition itself) can (and hence should) really be private to grant_table.c. Signed-off-by: Jan Beulich <jbeulich@suse.com> --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -127,10 +127,45 @@ shared_entry_header(struct grant_table * else return &shared_entry_v2(t, ref).hdr; } + +/* Active grant entry - used for shadowing GTF_permit_access grants. */ +struct active_grant_entry { + u32 pin; /* Reference count information. */ + domid_t domid; /* Domain being granted access. */ + struct domain *trans_domain; + uint32_t trans_gref; + unsigned long frame; /* Frame being granted. */ + unsigned long gfn; /* Guest''s idea of the frame being granted. */ + unsigned is_sub_page:1; /* True if this is a sub-page grant. */ + unsigned start:15; /* For sub-page grants, the start offset + in the page. */ + unsigned length:16; /* For sub-page grants, the length of the + grant. */ +}; + #define ACGNT_PER_PAGE (PAGE_SIZE / sizeof(struct active_grant_entry)) #define active_entry(t, e) \ ((t)->active[(e)/ACGNT_PER_PAGE][(e)%ACGNT_PER_PAGE]) +static inline unsigned int +num_act_frames_from_sha_frames(const unsigned int num) +{ + /* How many frames are needed for the active grant table, + * given the size of the shared grant table? */ + unsigned int sha_per_page = PAGE_SIZE / sizeof(grant_entry_v1_t); + unsigned int num_sha_entries = num * sha_per_page; + return (num_sha_entries + (ACGNT_PER_PAGE - 1)) / ACGNT_PER_PAGE; +} + +#define max_nr_active_grant_frames \ + num_act_frames_from_sha_frames(max_nr_grant_frames) + +static inline unsigned int +nr_active_grant_frames(struct grant_table *gt) +{ + return num_act_frames_from_sha_frames(nr_grant_frames(gt)); +} + /* Check if the page has been paged out, or needs unsharing. If rc == GNTST_okay, *page contains the page struct with a ref taken. Caller must do put_page(*page). @@ -2542,13 +2577,6 @@ do_grant_table_op( #include "compat/grant_table.c" #endif -static unsigned int max_nr_active_grant_frames(void) -{ - return (((max_nr_grant_frames * (PAGE_SIZE / sizeof(grant_entry_v1_t))) + - ((PAGE_SIZE / sizeof(struct active_grant_entry))-1)) - / (PAGE_SIZE / sizeof(struct active_grant_entry))); -} - int grant_table_create( struct domain *d) @@ -2565,7 +2593,7 @@ grant_table_create( /* Active grant table. */ if ( (t->active = xzalloc_array(struct active_grant_entry *, - max_nr_active_grant_frames())) == NULL ) + max_nr_active_grant_frames)) == NULL ) goto no_mem_1; for ( i = 0; i < num_act_frames_from_sha_frames(INITIAL_NR_GRANT_FRAMES); i++ ) --- a/xen/include/xen/grant_table.h +++ b/xen/include/xen/grant_table.h @@ -28,21 +28,6 @@ #include <asm/page.h> #include <asm/grant_table.h> -/* Active grant entry - used for shadowing GTF_permit_access grants. */ -struct active_grant_entry { - u32 pin; /* Reference count information. */ - domid_t domid; /* Domain being granted access. */ - struct domain *trans_domain; - uint32_t trans_gref; - unsigned long frame; /* Frame being granted. */ - unsigned long gfn; /* Guest''s idea of the frame being granted. */ - unsigned is_sub_page:1; /* True if this is a sub-page grant. */ - unsigned start:15; /* For sub-page grants, the start offset - in the page. */ - unsigned length:16; /* For sub-page grants, the length of the - grant. */ -}; - /* Count of writable host-CPU mappings. */ #define GNTPIN_hstw_shift (0) #define GNTPIN_hstw_inc (1 << GNTPIN_hstw_shift) @@ -147,23 +132,4 @@ static inline unsigned int grant_to_stat GRANT_STATUS_PER_PAGE; } -static inline unsigned int -num_act_frames_from_sha_frames(const unsigned int num) -{ - /* How many frames are needed for the active grant table, - * given the size of the shared grant table? */ - unsigned act_per_page = PAGE_SIZE / sizeof(struct active_grant_entry); - unsigned sha_per_page = PAGE_SIZE / sizeof(grant_entry_v1_t); - unsigned num_sha_entries = num * sha_per_page; - unsigned num_act_frames - (num_sha_entries + (act_per_page-1)) / act_per_page; - return num_act_frames; -} - -static inline unsigned int -nr_active_grant_frames(struct grant_table *gt) -{ - return num_act_frames_from_sha_frames(nr_grant_frames(gt)); -} - #endif /* __XEN_GRANT_TABLE_H__ */ _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel
Keir Fraser
2012-Sep-11 13:34 UTC
Re: [PATCH] gnttab: cleanup of number-of-active-frames calculations
On 11/09/2012 12:58, "Jan Beulich" <JBeulich@suse.com> wrote:> max_nr_active_grant_frames() is merly is special case of > num_act_frames_from_sha_frames(), so there''s no need to have a special > case implementation for it. > > Further, some of the related definitions (including the "struct > active_grant_entry" definition itself) can (and hence should) really be > private to grant_table.c. > > Signed-off-by: Jan Beulich <jbeulich@suse.com>Acked-by: Keir Fraser <keir@xen.org>> --- a/xen/common/grant_table.c > +++ b/xen/common/grant_table.c > @@ -127,10 +127,45 @@ shared_entry_header(struct grant_table * > else > return &shared_entry_v2(t, ref).hdr; > } > + > +/* Active grant entry - used for shadowing GTF_permit_access grants. */ > +struct active_grant_entry { > + u32 pin; /* Reference count information. */ > + domid_t domid; /* Domain being granted access. */ > + struct domain *trans_domain; > + uint32_t trans_gref; > + unsigned long frame; /* Frame being granted. */ > + unsigned long gfn; /* Guest''s idea of the frame being granted. */ > + unsigned is_sub_page:1; /* True if this is a sub-page grant. */ > + unsigned start:15; /* For sub-page grants, the start offset > + in the page. */ > + unsigned length:16; /* For sub-page grants, the length of the > + grant. */ > +}; > + > #define ACGNT_PER_PAGE (PAGE_SIZE / sizeof(struct active_grant_entry)) > #define active_entry(t, e) \ > ((t)->active[(e)/ACGNT_PER_PAGE][(e)%ACGNT_PER_PAGE]) > > +static inline unsigned int > +num_act_frames_from_sha_frames(const unsigned int num) > +{ > + /* How many frames are needed for the active grant table, > + * given the size of the shared grant table? */ > + unsigned int sha_per_page = PAGE_SIZE / sizeof(grant_entry_v1_t); > + unsigned int num_sha_entries = num * sha_per_page; > + return (num_sha_entries + (ACGNT_PER_PAGE - 1)) / ACGNT_PER_PAGE; > +} > + > +#define max_nr_active_grant_frames \ > + num_act_frames_from_sha_frames(max_nr_grant_frames) > + > +static inline unsigned int > +nr_active_grant_frames(struct grant_table *gt) > +{ > + return num_act_frames_from_sha_frames(nr_grant_frames(gt)); > +} > + > /* Check if the page has been paged out, or needs unsharing. > If rc == GNTST_okay, *page contains the page struct with a ref taken. > Caller must do put_page(*page). > @@ -2542,13 +2577,6 @@ do_grant_table_op( > #include "compat/grant_table.c" > #endif > > -static unsigned int max_nr_active_grant_frames(void) > -{ > - return (((max_nr_grant_frames * (PAGE_SIZE / sizeof(grant_entry_v1_t))) + > - ((PAGE_SIZE / sizeof(struct active_grant_entry))-1)) > - / (PAGE_SIZE / sizeof(struct active_grant_entry))); > -} > - > int > grant_table_create( > struct domain *d) > @@ -2565,7 +2593,7 @@ grant_table_create( > > /* Active grant table. */ > if ( (t->active = xzalloc_array(struct active_grant_entry *, > - max_nr_active_grant_frames())) == NULL ) > + max_nr_active_grant_frames)) == NULL ) > goto no_mem_1; > for ( i = 0; > i < num_act_frames_from_sha_frames(INITIAL_NR_GRANT_FRAMES); i++ ) > --- a/xen/include/xen/grant_table.h > +++ b/xen/include/xen/grant_table.h > @@ -28,21 +28,6 @@ > #include <asm/page.h> > #include <asm/grant_table.h> > > -/* Active grant entry - used for shadowing GTF_permit_access grants. */ > -struct active_grant_entry { > - u32 pin; /* Reference count information. */ > - domid_t domid; /* Domain being granted access. */ > - struct domain *trans_domain; > - uint32_t trans_gref; > - unsigned long frame; /* Frame being granted. */ > - unsigned long gfn; /* Guest''s idea of the frame being granted. */ > - unsigned is_sub_page:1; /* True if this is a sub-page grant. */ > - unsigned start:15; /* For sub-page grants, the start offset > - in the page. */ > - unsigned length:16; /* For sub-page grants, the length of the > - grant. */ > -}; > - > /* Count of writable host-CPU mappings. */ > #define GNTPIN_hstw_shift (0) > #define GNTPIN_hstw_inc (1 << GNTPIN_hstw_shift) > @@ -147,23 +132,4 @@ static inline unsigned int grant_to_stat > GRANT_STATUS_PER_PAGE; > } > > -static inline unsigned int > -num_act_frames_from_sha_frames(const unsigned int num) > -{ > - /* How many frames are needed for the active grant table, > - * given the size of the shared grant table? */ > - unsigned act_per_page = PAGE_SIZE / sizeof(struct active_grant_entry); > - unsigned sha_per_page = PAGE_SIZE / sizeof(grant_entry_v1_t); > - unsigned num_sha_entries = num * sha_per_page; > - unsigned num_act_frames > - (num_sha_entries + (act_per_page-1)) / act_per_page; > - return num_act_frames; > -} > - > -static inline unsigned int > -nr_active_grant_frames(struct grant_table *gt) > -{ > - return num_act_frames_from_sha_frames(nr_grant_frames(gt)); > -} > - > #endif /* __XEN_GRANT_TABLE_H__ */ > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel