clean up grant_table.h

Many definitions can be moved from xen/grant_table.h to
common/grant_table.c now, as they are no longer used in other sources.

Rearrange the elements of struct grant_table to minimize holes due to
alignment of elements.

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Paul Durrant <paul.durrant@citrix.com>
Reviewed-by: Wei Liu <wei.liu2@citrix.com>
This commit is contained in:
Juergen Gross authored and Jan Beulich committed 2017-09-20 17:18:58 +02:00
1 parent 54a98549e0
commit 0581b81c2a
2 files changed
+80 -79

No files matched your search

+80 -1
View File
@@ -40,6 +40,45 @@
#include <xsm/xsm.h>
#include <asm/flushtlb.h>
/* Per-domain grant information. */
struct grant_table {
/*
* Lock protecting updates to grant table state (version, active
* entry list, etc.)
*/
percpu_rwlock_t lock;
/* Lock protecting the maptrack limit */
spinlock_t maptrack_lock;
/*
* The defined versions are 1 and 2. Set to 0 if we don't know
* what version to use yet.
*/
unsigned int gt_version;
/* Table size. Number of frames shared with guest */
unsigned int nr_grant_frames;
/* Number of grant status frames shared with guest (for version 2) */
unsigned int nr_status_frames;
/* Number of available maptrack entries. */
unsigned int maptrack_limit;
/* Shared grant table (see include/public/grant_table.h). */
union {
void **shared_raw;
struct grant_entry_v1 **shared_v1;
union grant_entry_v2 **shared_v2;
};
/* State grant table (see include/public/grant_table.h). */
grant_status_t **status;
/* Active grant table. */
struct active_grant_entry **active;
/* Mapping tracking table per vcpu. */
struct grant_mapping **maptrack;
};
#ifndef DEFAULT_MAX_NR_GRANT_FRAMES /* to allow arch to override */
/* Default maximum size of a grant table. [POLICY] */
#define DEFAULT_MAX_NR_GRANT_FRAMES 32
#endif
unsigned int __read_mostly max_grant_frames;
integer_param("gnttab_max_frames", max_grant_frames);
@@ -118,6 +157,18 @@ struct grant_mapping {
uint32_t pad; /* round size to a power of 2 */
};
/* Number of grant table frames. Caller must hold d's grant table lock. */
static inline unsigned int nr_grant_frames(const struct grant_table *gt)
{
return gt->nr_grant_frames;
}
/* Number of status grant table frames. Caller must hold d's gr. table lock.*/
static inline unsigned int nr_status_frames(const struct grant_table *gt)
{
return gt->nr_status_frames;
}
#define MAPTRACK_PER_PAGE (PAGE_SIZE / sizeof(struct grant_mapping))
#define maptrack_entry(t, e) \
((t)->maptrack[(e)/MAPTRACK_PER_PAGE][(e)%MAPTRACK_PER_PAGE])
@@ -197,7 +248,27 @@ static inline void act_set_gfn(struct active_grant_entry *act, gfn_t gfn)
#endif
}
DEFINE_PERCPU_RWLOCK_GLOBAL(grant_rwlock);
static DEFINE_PERCPU_RWLOCK_GLOBAL(grant_rwlock);
static inline void grant_read_lock(struct grant_table *gt)
{
percpu_read_lock(grant_rwlock, &gt->lock);
}
static inline void grant_read_unlock(struct grant_table *gt)
{
percpu_read_unlock(grant_rwlock, &gt->lock);
}
static inline void grant_write_lock(struct grant_table *gt)
{
percpu_write_lock(grant_rwlock, &gt->lock);
}
static inline void grant_write_unlock(struct grant_table *gt)
{
percpu_write_unlock(grant_rwlock, &gt->lock);
}
static inline void gnttab_flush_tlb(const struct domain *d)
{
@@ -250,6 +321,14 @@ static inline void active_entry_release(struct active_grant_entry *act)
spin_unlock(&act->lock);
}
#define GRANT_STATUS_PER_PAGE (PAGE_SIZE / sizeof(grant_status_t))
#define GRANT_PER_PAGE (PAGE_SIZE / sizeof(grant_entry_v2_t))
/* Number of grant table status entries. Caller must hold d's gr. table lock.*/
static inline unsigned int grant_to_status_frames(unsigned int grant_frames)
{
return DIV_ROUND_UP(grant_frames * GRANT_PER_PAGE, GRANT_STATUS_PER_PAGE);
}
/* 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).
-78
View File
@@ -29,66 +29,9 @@
#include <asm/page.h>
#include <asm/grant_table.h>
#ifndef DEFAULT_MAX_NR_GRANT_FRAMES /* to allow arch to override */
/* Default maximum size of a grant table. [POLICY] */
#define DEFAULT_MAX_NR_GRANT_FRAMES 32
#endif
/* The maximum size of a grant table. */
extern unsigned int max_grant_frames;
DECLARE_PERCPU_RWLOCK_GLOBAL(grant_rwlock);
/* Per-domain grant information. */
struct grant_table {
/*
* Lock protecting updates to grant table state (version, active
* entry list, etc.)
*/
percpu_rwlock_t lock;
/* Table size. Number of frames shared with guest */
unsigned int nr_grant_frames;
/* Shared grant table (see include/public/grant_table.h). */
union {
void **shared_raw;
struct grant_entry_v1 **shared_v1;
union grant_entry_v2 **shared_v2;
};
/* Number of grant status frames shared with guest (for version 2) */
unsigned int nr_status_frames;
/* State grant table (see include/public/grant_table.h). */
grant_status_t **status;
/* Active grant table. */
struct active_grant_entry **active;
/* Mapping tracking table per vcpu. */
struct grant_mapping **maptrack;
unsigned int maptrack_limit;
/* Lock protecting the maptrack limit */
spinlock_t maptrack_lock;
/* The defined versions are 1 and 2. Set to 0 if we don't know
what version to use yet. */
unsigned gt_version;
};
static inline void grant_read_lock(struct grant_table *gt)
{
percpu_read_lock(grant_rwlock, &gt->lock);
}
static inline void grant_read_unlock(struct grant_table *gt)
{
percpu_read_unlock(grant_rwlock, &gt->lock);
}
static inline void grant_write_lock(struct grant_table *gt)
{
percpu_write_lock(grant_rwlock, &gt->lock);
}
static inline void grant_write_unlock(struct grant_table *gt)
{
percpu_write_unlock(grant_rwlock, &gt->lock);
}
/* Create/destroy per-domain grant table context. */
int grant_table_create(
struct domain *d);
@@ -106,27 +49,6 @@ void
gnttab_release_mappings(
struct domain *d);
/* Number of grant table frames. Caller must hold d's grant table lock. */
static inline unsigned int nr_grant_frames(struct grant_table *gt)
{
return gt->nr_grant_frames;
}
/* Number of status grant table frames. Caller must hold d's gr. table lock.*/
static inline unsigned int nr_status_frames(struct grant_table *gt)
{
return gt->nr_status_frames;
}
#define GRANT_STATUS_PER_PAGE (PAGE_SIZE / sizeof(grant_status_t))
#define GRANT_PER_PAGE (PAGE_SIZE / sizeof(grant_entry_v2_t))
/* Number of grant table status entries. Caller must hold d's gr. table lock.*/
static inline unsigned int grant_to_status_frames(int grant_frames)
{
return (grant_frames * GRANT_PER_PAGE + GRANT_STATUS_PER_PAGE - 1) /
GRANT_STATUS_PER_PAGE;
}
int mem_sharing_gref_to_gfn(struct grant_table *gt, grant_ref_t ref,
gfn_t *gfn, uint16_t *status);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.