Edata: Pull out comparison fields into a summary.

For now, this is a no-op; eventually, it will allow some caching in the eset.
This commit is contained in:
David Goldblatt 2021-07-20 09:02:17 -07:00 committed by David Goldblatt
parent 0170dd198a
commit dc0a4b8b2f

View File

@ -79,6 +79,12 @@ struct edata_map_info_s {
szind_t szind; szind_t szind;
}; };
typedef struct edata_cmp_summary_s edata_cmp_summary_t;
struct edata_cmp_summary_s {
uint64_t sn;
uintptr_t addr;
};
/* Extent (span of pages). Use accessor functions for e_* fields. */ /* Extent (span of pages). Use accessor functions for e_* fields. */
typedef struct edata_s edata_t; typedef struct edata_s edata_t;
ph_structs(edata_avail, edata_t); ph_structs(edata_avail, edata_t);
@ -610,14 +616,6 @@ edata_binit(edata_t *edata, void *addr, size_t bsize, uint64_t sn) {
edata_pai_set(edata, EXTENT_PAI_PAC); edata_pai_set(edata, EXTENT_PAI_PAC);
} }
static inline int
edata_sn_comp(const edata_t *a, const edata_t *b) {
uint64_t a_sn = edata_sn_get(a);
uint64_t b_sn = edata_sn_get(b);
return (a_sn > b_sn) - (a_sn < b_sn);
}
static inline int static inline int
edata_esn_comp(const edata_t *a, const edata_t *b) { edata_esn_comp(const edata_t *a, const edata_t *b) {
size_t a_esn = edata_esn_get(a); size_t a_esn = edata_esn_get(a);
@ -626,14 +624,6 @@ edata_esn_comp(const edata_t *a, const edata_t *b) {
return (a_esn > b_esn) - (a_esn < b_esn); return (a_esn > b_esn) - (a_esn < b_esn);
} }
static inline int
edata_ad_comp(const edata_t *a, const edata_t *b) {
uintptr_t a_addr = (uintptr_t)edata_addr_get(a);
uintptr_t b_addr = (uintptr_t)edata_addr_get(b);
return (a_addr > b_addr) - (a_addr < b_addr);
}
static inline int static inline int
edata_ead_comp(const edata_t *a, const edata_t *b) { edata_ead_comp(const edata_t *a, const edata_t *b) {
uintptr_t a_eaddr = (uintptr_t)a; uintptr_t a_eaddr = (uintptr_t)a;
@ -642,19 +632,31 @@ edata_ead_comp(const edata_t *a, const edata_t *b) {
return (a_eaddr > b_eaddr) - (a_eaddr < b_eaddr); return (a_eaddr > b_eaddr) - (a_eaddr < b_eaddr);
} }
static inline int static inline edata_cmp_summary_t
edata_snad_comp(const edata_t *a, const edata_t *b) { edata_cmp_summary_get(const edata_t *edata) {
int ret; return (edata_cmp_summary_t){edata_sn_get(edata),
(uintptr_t)edata_addr_get(edata)};
}
ret = edata_sn_comp(a, b); static inline int
edata_cmp_summary_comp(edata_cmp_summary_t a, edata_cmp_summary_t b) {
int ret;
ret = (a.sn > b.sn) - (a.sn < b.sn);
if (ret != 0) { if (ret != 0) {
return ret; return ret;
} }
ret = (a.addr > b.addr) - (a.addr < b.addr);
ret = edata_ad_comp(a, b);
return ret; return ret;
} }
static inline int
edata_snad_comp(const edata_t *a, const edata_t *b) {
edata_cmp_summary_t a_cmp = edata_cmp_summary_get(a);
edata_cmp_summary_t b_cmp = edata_cmp_summary_get(b);
return edata_cmp_summary_comp(a_cmp, b_cmp);
}
static inline int static inline int
edata_esnead_comp(const edata_t *a, const edata_t *b) { edata_esnead_comp(const edata_t *a, const edata_t *b) {
int ret; int ret;