[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] pci-arbiter: Stop using deprecated region memory pointer
From: |
Samuel Thibault |
Subject: |
Re: [PATCH] pci-arbiter: Stop using deprecated region memory pointer |
Date: |
Sat, 8 Jan 2022 19:11:29 +0100 |
User-agent: |
NeoMutt/20170609 (1.8.3) |
Joan Lledó, le sam. 08 janv. 2022 13:15:37 +0100, a ecrit:
> From: Joan Lledó <jlledom@member.fsf.org>
>
> Use a internal array of pointers instead
Applied, thanks!
Samuel
> * pci-arbiter/device_map.h:
> * Update device_map_region() prototype
> * Now it receives an output address as parameter
> * pci-arbiter/device_map.c:
> * Update device_map_region() definition to match the new prototype
> * Support for legacy mappings
> * When the base address is lower than 1 mb
> * pci-arbiter/func_files.c:
> * pci-arbiter/netfs_impl.c:
> * Update calls to device_map_region to match the new prototype
> * Use the internal array of pointers instead of region->memory
> * pci-arbiter/pcifs.h:
> * struct pcifs_dirent: Declare the internal array of pointers
> ---
> pci-arbiter/device_map.c | 19 +++++++++++++++----
> pci-arbiter/device_map.h | 2 +-
> pci-arbiter/func_files.c | 6 +++---
> pci-arbiter/netfs_impl.c | 8 +++++---
> pci-arbiter/pcifs.h | 7 +++++++
> 5 files changed, 31 insertions(+), 11 deletions(-)
>
> diff --git a/pci-arbiter/device_map.c b/pci-arbiter/device_map.c
> index 216adfb9..1627746d 100644
> --- a/pci-arbiter/device_map.c
> +++ b/pci-arbiter/device_map.c
> @@ -24,14 +24,25 @@
> #include "device_map.h"
>
> error_t
> -device_map_region (struct pci_device *device, struct pci_mem_region *region)
> +device_map_region (struct pci_device *device, struct pci_mem_region *region,
> + void **addr)
> {
> error_t err = 0;
>
> - if (region->memory == 0)
> + if (*addr == 0)
> {
> - err = pci_device_map_range (device, region->base_addr, region->size,
> - PCI_DEV_MAP_FLAG_WRITABLE, ®ion->memory);
> + /*
> + * We could use the non-legacy call for all ranges, but libpciaccess
> + * offers a call for ranges under 1Mb. We call it for those cases, even
> + * when there's no difference for us.
> + */
> + if (region->base_addr > 0x100000
> + || region->base_addr + region->size > 0x100000)
> + err = pci_device_map_range (device, region->base_addr, region->size,
> + PCI_DEV_MAP_FLAG_WRITABLE, addr);
> + else
> + err = pci_device_map_legacy (device, region->base_addr, region->size,
> + PCI_DEV_MAP_FLAG_WRITABLE, addr);
> }
>
> return err;
> diff --git a/pci-arbiter/device_map.h b/pci-arbiter/device_map.h
> index 9062e901..0d92650c 100644
> --- a/pci-arbiter/device_map.h
> +++ b/pci-arbiter/device_map.h
> @@ -27,6 +27,6 @@
> #include <pciaccess.h>
>
> error_t device_map_region (struct pci_device *device,
> - struct pci_mem_region *region);
> + struct pci_mem_region *region, void **addr);
>
> #endif /* DEVICE_MAP_H */
> diff --git a/pci-arbiter/func_files.c b/pci-arbiter/func_files.c
> index 81ebfded..40706135 100644
> --- a/pci-arbiter/func_files.c
> +++ b/pci-arbiter/func_files.c
> @@ -205,13 +205,13 @@ io_region_file (struct pcifs_dirent * e, off_t offset,
> size_t * len,
> else
> {
> /* Ensure the region is mapped */
> - err = device_map_region (e->device, region);
> + err = device_map_region (e->device, region, &e->region_maps[reg_num]);
> if (err)
> return err;
> if (read)
> - memcpy (data, region->memory + offset, *len);
> + memcpy (data, e->region_maps[reg_num] + offset, *len);
> else
> - memcpy (region->memory + offset, data, *len);
> + memcpy (e->region_maps[reg_num] + offset, data, *len);
> }
>
> return err;
> diff --git a/pci-arbiter/netfs_impl.c b/pci-arbiter/netfs_impl.c
> index 8b4bd22b..63f8354e 100644
> --- a/pci-arbiter/netfs_impl.c
> +++ b/pci-arbiter/netfs_impl.c
> @@ -591,15 +591,17 @@ netfs_get_filemap (struct node *node, vm_prot_t prot)
> region = &node->nn->ln->device->regions[reg_num];
>
> /* Ensure the region is mapped */
> - err = device_map_region (node->nn->ln->device, region);
> + err = device_map_region (node->nn->ln->device, region,
> + &node->nn->ln->region_maps[reg_num]);
> if (err)
> return err;
>
> /* Create a new memory object proxy with the required protection */
> max_prot = (VM_PROT_READ | VM_PROT_WRITE) & prot;
> err =
> - vm_region_create_proxy(mach_task_self (), (vm_address_t)region->memory,
> - max_prot, region->size, &proxy);
> + vm_region_create_proxy(mach_task_self (),
> + (vm_address_t)node->nn->ln->region_maps[reg_num],
> + max_prot, region->size, &proxy);
> if (err)
> goto error;
>
> diff --git a/pci-arbiter/pcifs.h b/pci-arbiter/pcifs.h
> index 18f2141c..050c9e32 100644
> --- a/pci-arbiter/pcifs.h
> +++ b/pci-arbiter/pcifs.h
> @@ -91,6 +91,13 @@ struct pcifs_dirent
> * Only for entries having a full B/D/F address.
> */
> struct pci_device *device;
> +
> + /*
> + * Array of addresses where regions are mapped
> + *
> + * Only when a device is present
> + */
> + void *region_maps[6];
> };
>
> /*
> --
> 2.31.1