summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoan Lledó <jlledom@member.fsf.org>2021-06-19 12:12:36 +0200
committerJoan Lledó <jlledom@member.fsf.org>2021-11-21 11:40:17 +0100
commit90681245ff42e3962d2ee1c6f3103c6d6a9f2ed1 (patch)
treee6cfab8e4065de2b4aff01ae4f3ebb7d99c19b66
parenta40c3fdb9532fd82e83828608a632a066ffd1e8f (diff)
pci-arbiter: allow mapping nested proxies
-rw-r--r--pci-arbiter/netfs_impl.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/pci-arbiter/netfs_impl.c b/pci-arbiter/netfs_impl.c
index 9a55a0e7..2a0dd1c1 100644
--- a/pci-arbiter/netfs_impl.c
+++ b/pci-arbiter/netfs_impl.c
@@ -574,6 +574,7 @@ netfs_get_filemap (struct node *node, vm_prot_t prot)
{
error_t err;
memory_object_t pager, proxy;
+ boolean_t pager_is_proxy;
vm_prot_t max_prot;
size_t reg_num, count;
struct pci_mem_region *region;
@@ -601,14 +602,17 @@ netfs_get_filemap (struct node *node, vm_prot_t prot)
/* Get the pager which we are creating a proxy from */
pager =
- ((struct pci_user_data *) node->nn->ln->device->user_data)->
- pagers[reg_num];
+ ((struct pci_user_data *) node->nn->ln->device->
+ user_data)->pagers[reg_num];
+
+ /* Find out whther pager is already a proxy */
+ memory_object_proxy_valid (pager, &pager_is_proxy);
/* Get all params to create the proxy */
max_prot = (VM_PROT_READ | VM_PROT_WRITE) & prot;
objects[0] = pager;
offsets[0] = 0;
- starts[0] = region->base_addr;
+ starts[0] = pager_is_proxy ? 0 : region->base_addr;
lens[0] = region->size;
count = 1;