env/vtophys: pass physical address to _spdk_vtophys_register_one()
This just moves the lookup of the physical address up one level - now _spdk_vtophys_register_one() is only responsible for filling out the mapping table, not looking up the translation. Change-Id: I9fd5b85da623e403fda0563b6bdebd4aaaf42864 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
d1638fb677
commit
6ea5280b04
@ -187,14 +187,17 @@ vtophys_get_paddr(uint64_t vaddr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_spdk_vtophys_register_one(uint64_t vfn_2mb)
|
_spdk_vtophys_register_one(uint64_t vfn_2mb, uint64_t paddr)
|
||||||
{
|
{
|
||||||
struct map_1gb *map_1gb;
|
struct map_1gb *map_1gb;
|
||||||
uint64_t idx_1gb = MAP_1GB_IDX(vfn_2mb);
|
uint64_t idx_1gb = MAP_1GB_IDX(vfn_2mb);
|
||||||
struct map_2mb *map_2mb;
|
struct map_2mb *map_2mb;
|
||||||
uint16_t *ref_count;
|
uint16_t *ref_count;
|
||||||
void *vaddr;
|
|
||||||
uint64_t paddr;
|
if (paddr & MASK_2MB) {
|
||||||
|
fprintf(stderr, "invalid paddr 0x%" PRIx64 " - must be 2MB aligned\n", paddr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
map_1gb = vtophys_get_map_1gb(vfn_2mb);
|
map_1gb = vtophys_get_map_1gb(vfn_2mb);
|
||||||
if (!map_1gb) {
|
if (!map_1gb) {
|
||||||
@ -205,24 +208,14 @@ _spdk_vtophys_register_one(uint64_t vfn_2mb)
|
|||||||
map_2mb = &map_1gb->map[idx_1gb];
|
map_2mb = &map_1gb->map[idx_1gb];
|
||||||
ref_count = &map_1gb->ref_count[idx_1gb];
|
ref_count = &map_1gb->ref_count[idx_1gb];
|
||||||
|
|
||||||
if (map_2mb->paddr_2mb == SPDK_VTOPHYS_ERROR) {
|
|
||||||
vaddr = (void *)(vfn_2mb << SHIFT_2MB);
|
|
||||||
paddr = vtophys_get_dpdk_paddr(vaddr);
|
|
||||||
if (paddr == RTE_BAD_PHYS_ADDR) {
|
|
||||||
fprintf(stderr, "could not get phys addr for %p\n", vaddr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
map_2mb->paddr_2mb = paddr & ~MASK_2MB;
|
|
||||||
*ref_count = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*ref_count == VTOPHYS_MAX_REF_COUNT) {
|
if (*ref_count == VTOPHYS_MAX_REF_COUNT) {
|
||||||
fprintf(stderr, "ref count for %p already at %d\n",
|
fprintf(stderr, "ref count for %p already at %d\n",
|
||||||
(void *)(vfn_2mb << SHIFT_2MB), VTOPHYS_MAX_REF_COUNT);
|
(void *)(vfn_2mb << SHIFT_2MB), VTOPHYS_MAX_REF_COUNT);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
map_2mb->paddr_2mb = paddr;
|
||||||
|
|
||||||
(*ref_count)++;
|
(*ref_count)++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,7 +267,15 @@ spdk_vtophys_register(void *vaddr, uint64_t len)
|
|||||||
len = len >> SHIFT_2MB;
|
len = len >> SHIFT_2MB;
|
||||||
|
|
||||||
while (len > 0) {
|
while (len > 0) {
|
||||||
_spdk_vtophys_register_one(vfn_2mb);
|
void *vaddr = (void *)(vfn_2mb << SHIFT_2MB);
|
||||||
|
uint64_t paddr = vtophys_get_dpdk_paddr(vaddr);
|
||||||
|
|
||||||
|
if (paddr == RTE_BAD_PHYS_ADDR) {
|
||||||
|
fprintf(stderr, "could not get phys addr for %p\n", vaddr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_spdk_vtophys_register_one(vfn_2mb, paddr);
|
||||||
vfn_2mb++;
|
vfn_2mb++;
|
||||||
len--;
|
len--;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user