|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 2/2] xen/arm: gnttab: modify macros to evaluate all arguments and only once
Modify macros to evaluate all the arguments and make sure the arguments
are evaluated only once. Introduce following intermediate macros:
gnttab_status_gfn_, gnttab_shared_gfn_ that do not take domain as a
parameter. These are to be used locally and allow us to avoid passing
NULL from gnttab_get_frame_gfn to the respective macros (without _ suffix).
Make use of a domain parameter from gnttab_shared_gfn and gnttab_status_gfn
by adding an ASSERT.
Signed-off-by: Michal Orzel <michal.orzel@xxxxxxx>
---
Changes since v1:
- use typeof for all data types
- introduce intermediate macros
---
xen/arch/arm/include/asm/grant_table.h | 75 ++++++++++++++++++--------
1 file changed, 54 insertions(+), 21 deletions(-)
diff --git a/xen/arch/arm/include/asm/grant_table.h
b/xen/arch/arm/include/asm/grant_table.h
index 5ccaf6d51f..3550990ceb 100644
--- a/xen/arch/arm/include/asm/grant_table.h
+++ b/xen/arch/arm/include/asm/grant_table.h
@@ -58,54 +58,87 @@ int replace_grant_host_mapping(unsigned long gpaddr, mfn_t
mfn,
#define gnttab_init_arch(gt) \
({ \
- unsigned int ngf_ = (gt)->max_grant_frames; \
+ typeof(gt) gt_ = (gt); \
+ unsigned int ngf_ = gt_->max_grant_frames; \
unsigned int nsf_ = grant_to_status_frames(ngf_); \
\
- (gt)->arch.shared_gfn = xmalloc_array(gfn_t, ngf_); \
- (gt)->arch.status_gfn = xmalloc_array(gfn_t, nsf_); \
- if ( (gt)->arch.shared_gfn && (gt)->arch.status_gfn ) \
+ gt_->arch.shared_gfn = xmalloc_array(gfn_t, ngf_); \
+ gt_->arch.status_gfn = xmalloc_array(gfn_t, nsf_); \
+ if ( gt_->arch.shared_gfn && gt_->arch.status_gfn ) \
{ \
while ( ngf_-- ) \
- (gt)->arch.shared_gfn[ngf_] = INVALID_GFN; \
+ gt_->arch.shared_gfn[ngf_] = INVALID_GFN; \
while ( nsf_-- ) \
- (gt)->arch.status_gfn[nsf_] = INVALID_GFN; \
+ gt_->arch.status_gfn[nsf_] = INVALID_GFN; \
} \
else \
- gnttab_destroy_arch(gt); \
- (gt)->arch.shared_gfn ? 0 : -ENOMEM; \
+ gnttab_destroy_arch(gt_); \
+ gt_->arch.shared_gfn ? 0 : -ENOMEM; \
})
#define gnttab_destroy_arch(gt) \
do { \
- XFREE((gt)->arch.shared_gfn); \
- XFREE((gt)->arch.status_gfn); \
+ typeof(gt) gt_ = (gt); \
+ XFREE(gt_->arch.shared_gfn); \
+ XFREE(gt_->arch.status_gfn); \
} while ( 0 )
#define gnttab_set_frame_gfn(gt, st, idx, gfn, mfn) \
({ \
int rc_ = 0; \
- gfn_t ogfn = gnttab_get_frame_gfn(gt, st, idx); \
- if ( gfn_eq(ogfn, INVALID_GFN) || gfn_eq(ogfn, gfn) || \
- (rc_ = guest_physmap_remove_page((gt)->domain, ogfn, mfn, \
+ const typeof(gt) gt_ = (gt); \
+ const typeof(st) st_ = (st); \
+ const typeof(idx) idx_ = (idx); \
+ const typeof(gfn) gfn_ = (gfn); \
+ const gfn_t ogfn_ = gnttab_get_frame_gfn(gt_, st_, idx_); \
+ if ( gfn_eq(ogfn_, INVALID_GFN) || gfn_eq(ogfn_, gfn_) || \
+ (rc_ = guest_physmap_remove_page(gt_->domain, ogfn_, mfn, \
0)) == 0 ) \
- ((st) ? (gt)->arch.status_gfn \
- : (gt)->arch.shared_gfn)[idx] = (gfn); \
+ (st_ ? gt_->arch.status_gfn \
+ : gt_->arch.shared_gfn)[idx_] = gfn_; \
rc_; \
})
#define gnttab_get_frame_gfn(gt, st, idx) ({ \
- (st) ? gnttab_status_gfn(NULL, gt, idx) \
- : gnttab_shared_gfn(NULL, gt, idx); \
+ (st) ? gnttab_status_gfn_(gt, idx) \
+ : gnttab_shared_gfn_(gt, idx); \
})
+#define gnttab_shared_gfn_(t, i) \
+ ({ \
+ const typeof(t) t_ = (t); \
+ const typeof(i) i_ = (i); \
+ (i_ >= nr_grant_frames(t_)) ? INVALID_GFN \
+ : t_->arch.shared_gfn[i_]; \
+ })
+
+#define gnttab_status_gfn_(t, i) \
+ ({ \
+ const typeof(t) t_ = (t); \
+ const typeof(i) i_ = (i); \
+ (i_ >= nr_status_frames(t_)) ? INVALID_GFN \
+ : t_->arch.status_gfn[i_]; \
+ })
+
#define gnttab_shared_gfn(d, t, i) \
- (((i) >= nr_grant_frames(t)) ? INVALID_GFN : (t)->arch.shared_gfn[i])
+ ({ \
+ const typeof(t) t_ = (t); \
+ ASSERT((d)->grant_table == t_); \
+ gnttab_shared_gfn_(t_, i); \
+ })
#define gnttab_status_gfn(d, t, i) \
- (((i) >= nr_status_frames(t)) ? INVALID_GFN : (t)->arch.status_gfn[i])
+ ({ \
+ const typeof(t) t_ = (t); \
+ ASSERT((d)->grant_table == t_); \
+ gnttab_status_gfn_(t_, i); \
+ })
-#define gnttab_need_iommu_mapping(d) \
- (is_domain_direct_mapped(d) && is_iommu_enabled(d))
+#define gnttab_need_iommu_mapping(d) \
+ ({ \
+ const typeof(d) d_ = (d); \
+ is_domain_direct_mapped(d_) && is_iommu_enabled(d_); \
+ })
#endif /* __ASM_GRANT_TABLE_H__ */
/*
--
2.25.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |