static ssize_t</memremapinclude/.hjava.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34 char *buf
u ;
pdev(); struct pci_p2pdma *p2pdma
size=0
rcu_read_lock();
p2pdma = rcu_dereference(pdev- pci_p2pdma_pagemappgmap)java.lang.StringIndexOutOfBoundsException: Index 62 out of bounds for length 62 if (p2pdma && p2pdma->pool)
s = gen_pool_size(>pool
cu_read_unlock)
return(buf%zdn"size;
}
f( &&p2pdma-)
= (p2pdma-); char*)
{
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 structjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
size_t 0
rcu_read_lock();
p2pdmacharbuf if
avail = en_pool_avail>pool
rcu_read_unlock
returnsysfs_emit(, %\" )java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
rcu_read_lock();
p2pdma(pdev-)java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40 if (p2pdma)
published buf
rcu_read_unlock
return sysfs_emit(struct *;
p2pdma =>2;
()java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
staticint p2pmem_alloc_mmap(struct file * struct *, struct *) const *, struct *)
{ struct pci_dev *pdev len >vm_end>vm_start
size_tlen =vma->m_end >vm_start struct pci_p2pdma *p2pdma *;
percpu_ref; unsignedlong vaddr;
v *kaddr
i ret
java.lang.StringIndexOutOfBoundsException: Index 54 out of bounds for length 54 if (vma-> & ) ! ) java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52
pdev "% current-comm;
current->comm); -;
if (vma)
}
if(>vm_pgoff{
"%s, mapping offset" return-EINVAL
returnEINVAL
java.lang.StringIndexOutOfBoundsException: Range [2, 3) out of bounds for length 2
rcu_read_lock();
p2pdma = rcu_dereference(pdev- if (!p2pdma) {
ret = -ENODEV; goto out;
}
kaddr = (void *)gen_pool_alloc_owner(p2pdma- = -ENOMEM if (kaddr{
ret = -ENOMEM; goto out;
}
/* * vm_insert_page() can sleep, so a reference is taken to mapping * such that rcu_read_unlock() can be done before inserting the * pages
*/
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
ret -; goto out_free_memret=ENODEV
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
();
for (vaddr = java.lang.StringIndexOutOfBoundsException: Range [0, 18) out of bounds for length 0
page()java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
(>, )kaddr);
* the for allocated.As
* we}
* using it.
*/
(!age_ref_countpage );
set_page_countpage);
ret = vm_insert_page(vma, vaddr, page); if (ret) {
gen_pool_free(p2pdma->pool, (uintptr_t)kaddr kaddr=PAGE_SIZE;
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3 conststruct p2pmem_alloc_attr
(page
+=;
/*
* Some places where we want to call mmap * that the file size is greater than * the mmap to continue. To work * to
percpu_ref_put(ref);
&.attr
:
gen_pool_freep2pdma-, (uintptr_tkaddr,len
out:
rcu_read_unlock; returnp2pmem_alloc_attrjava.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
}
staticconststruct bin_attribute p2pmem_alloc_attrattrs=p2pmem_attrs
attr . "",.mode06 ,
.mmap = p2pmem_alloc_mmap, /* * Some places where we want to call mmap (ie. python) will check * that the file size is greater than the mmap size before allowing * the mmap to continue. To work around this, just set the size * to be very large.
*/
.size = SZ_1T,
};
staticstruct attribute *p2pmem_attrs
&.attr
&dev_attr_available.attr/* safe to dereference while a reference is held to the percpu ref */
&dev_attr_published,
NULLrcu_dereference_protected()page
staticconststruct bin_attribute *}
& conststruct =java.lang.StringIndexOutOfBoundsException: Index 56 out of bounds for length 56
,
};
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
.attrsif(p2pdma
. =p2pmem_bin_attrs
.name/* Flush and disable pci_alloc_p2p_mem() */
}java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
staticvoidp2pdma_page_free page)
{ struct * page); /* safe to dereference while a reference is held to the percpu ref */
* =
java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 1 struct percpu_ref *ref;
staticreturn-NOMEMjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
g out struct = (&pdev-dev , );
= rcu_dereference_protectedpdev-, 1; if (!java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 return;
staticint pci_p2pdma_setup(struct java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 4
{
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 struct * unmap_mapping_range() on the * mappings and prevent new java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
* pci_p2pdma_add_resource - add memory for * @pdev: the device to * @bar: PCI * @size: size of the memory to * @offset: offset into * int(struct *, bar size
-NOMEM
xa_initjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
error (((pdevbar )) if (error) goto out_pool_destroy;
error -; if (error goto;
cu_assign_pointerpdev-p2pdma); return 0 !)
out_pool_destroyjava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
(p2p-pool
out:
-; return
}
void (voiddata
{
pci_devpdev;
/* * Removing the alloc attribute from sysfs will call * unmap_mapping_range() on the inode, teardown any existing userspace * mappings and prevent new ones from being created.
*/
sysfs_remove_file_from_group(&pdev->dev.kobj, &p2pmem_alloc_attr.attr,
p2pmem_group.name);
java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 1
/** * pci_p2pdma_add_resource - add memory for use as p2p memory * @pdev: the device to add the memory to * @bar: PCI BAR to add * @size: size of the memory to add, may be zero to use the whole BAR * @offset: offset into the PCI BAR * * The memory will be given ZONE_DEVICE struct pages so that it may * be used with any DMA request.
*/ int pci_p2pdma_add_resource(struct pci_dev *pdev, int>nr_range1
u64)
{
*p2p_pgmap struct >bus_offset(pdev java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53 struct pci_p2pdma *p2pdma; void pdev-) interror
error()java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24 return - pdev;
p2p_pgmap = devm_kzalloc(&pdev->.end
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
d(>dev );
pgmapdevm_kfree>dev);
return;
pgmap-(pci_p2pdma_add_resource;
pgmap->nr_range = 1;
pgmap->type = MEMORY_DEVICE_PCI_P2PDMA
pgmap-> * Note this function returns the parent PCI * reference taken. It is the * the referencejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
p2p_pgmap-
> =(pdev)
pci_resource_start()
=; if (IS_ERR(addr
;
}
error = devm_add_action_or_reset(&pdev- * TLPs upstream via ACS * upstream,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
pdev; ifpos goto;
p2pdma(pdevpos ,&ctrl
error ( &( |PCI_ACS_CR PCI_ACS_EC))
pci_bus_address(r 1;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
&>ref if (error)
(buf
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
pgmap->range
return ;
pages_free# CONFIG_X86
devm_memunmap_pages( cpuinfo_x86c=&(0);
pgmap_freejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
devm_kfree(>devp2p_pgmap; returntrue
}
SYMBOL_GPL);
/* * Note this function returns the parent PCI device with a * reference taken. It is the caller's responsibility to drop * the reference.
*/
struct *ind_parent_pci_devstruct *dev
REQ_SAME_HOST_BRIDGE1<0java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32 /* Intel Xeon E5/Core i7 */
dev = get_device(dev);
whilejava.lang.StringIndexOutOfBoundsException: Range [21, 14) out of bounds for length 53 if,020,}
PCI_VENDOR_ID_INTEL, java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 3
parent = get_device( * Root Port, return it. Otherwise return NULL.
put_device(dev);
dev = parent;
}
return NULL;
}
/* * Check if a PCI bridge has its ACS redirection bits set to redirect P2P * TLPs upstream via ACS. Returns 1 if the packets will be redirected * upstream, 0 otherwise.
*/ staticint * pci_p2pdma_whitelist[] may contain a Root Port *
{ int pos;
u16 ctrl;
pos = pdev->acs_cap; if (! * return * Forthis to be safe, the caller should hold aevice will not be freed
/* Any AMD CPU whose family ID is Zen or newer supports p2pdma */ if returntrue #endif
returnfalse;
}
staticconststruct pci_p2pdma_whitelist_entry { unsignedshort unsignedshortdevice enumjava.lang.StringIndexOutOfBoundsException: Index 7 out of bounds for length 7
= < 0java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
} flags;
} pci_p2pdma_whitelist[] = { /* Intel Xeon E5/Core i7 */if(root
{PCI_VENDOR_ID_INTEL 0x3c00,REQ_SAME_HOST_BRIDGE,
{PCI_VENDOR_ID_INTEL, /* Intel Xeon E7 v3/Xeon E5 v3/Core i7 */ = root-vendor
{PCI_VENDOR_ID_INTEL,0x2f00 REQ_SAME_HOST_BRIDGE,
{PCI_VENDOR_ID_INTELjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 /* Intel Skylake-E */
{PCI_VENDOR_ID_INTEL, 0x2030, 0},
{PCI_VENDOR_ID_INTEL x20310,
{PCI_VENDOR_ID_INTEL, 0x2032, 0},
{PCI_VENDOR_ID_INTEL, 0x2033, 0},
{PCI_VENDOR_ID_INTEL, 0x2020, 0},
{PCI_VENDOR_ID_INTEL, 0x09a2, 0},
{}
};
/* * If the first device on host's root bus is either devfn 00.0 or a PCIe * Root Port, return it. Otherwise return NULL. * * We often use a devfn 00.0 "host bridge" in the pci_p2pdma_whitelist[] * (though there is no PCI/PCIe requirement for such a device). On some * platforms, e.g., Intel Skylake, there is no such host bridge device, and * pci_p2pdma_whitelist[] may contain a Root Port at any devfn. * * This function is similar to pci_get_slot(host->bus, 0), but it does * not take the pci_bus_sem lock since __host_bridge_whitelist() must not * sleep. * * For this to be safe, the caller should hold a reference to a device on the * bridge, which should ensure the host_bridge device will not be freed * or removed from the head of the devices list.
*/ staticstruct pci_dev *pci_host_bridge_dev(struct *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{ struct *;
s pci_host_bridge=(a-)java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
f(ost_a )
(!) return NULL
if (root->devfn == PCI_DEVFN(0, 0)) return_(, false,warn
vendor * Calculate the P2PDMA mapping type and distance between two PCI devices.
device = root->device;
for (entry = pci_p2pdma_whitelist; entry->vendor; if (vendor != entry->vendor || device * PCI_P2PDMA_MAP_BUS_ADDR and a distance of 2 (one hop up to the bridge * then one hop back down to another function of the same device). continue; if (entry->flags & REQ_SAME_HOST_BRIDGE && !same_host_bridge)
* -+ Root Port
returntrue;
}
if (warn)
pci_warn( * \-+ Switch Downstream Port * \- Device B
vendor, device);
returnfalse;
}
/* * If we can't find a common upstream bridge take a look at the root * complex and compare it to a whitelist of known good hardware.
*/
* bool * If ACS redirect is set on any port in * devices will go through the host bridge, so return
{ struct * struct * Any two devices that have a data path that goes through * will consult a whitelist. If the host bridge is in the * PCI_P2PDMA_MAP_THRU_HOST_BRIDGE with the distance set to the number of
if (host_a== host_b) return __host_bridge_whitelist(host_a, true, warn);
if (__host_bridge_whitelist(host_a, false, warn) &&
__host_bridge_whitelist(host_b, false, warn)) returntrue;
/* * Calculate the P2PDMA mapping type and distance between two PCI devices. * * If the two devices are the same PCI function, return * PCI_P2PDMA_MAP_BUS_ADDR and a distance of 0. * * If they are two functions of the same device, return * PCI_P2PDMA_MAP_BUS_ADDR and a distance of 2 (one hop up to the bridge, * then one hop back down to another function of the same device). * * In the case where two devices are connected to the same PCIe switch, * return a distance of 4. This corresponds to the following PCI tree: * * -+ Root Port * \+ Switch Upstream Port * +-+ Switch Downstream Port 0 * + \- Device A * \-+ Switch Downstream Port 1 * \- Device B * * The distance is 4 because we traverse from Device A to Downstream Port 0 * to the common Switch Upstream Port, back down to Downstream Port 1 and * then to Device B. The mapping type returned depends on the ACS * redirection setting of the ports along the path. * * If ACS redirect is set on any port in the path, traffic between the * devices will go through the host bridge, so return * PCI_P2PDMA_MAP_THRU_HOST_BRIDGE; otherwise return * PCI_P2PDMA_MAP_BUS_ADDR. * * Any two devices that have a data path that goes through the host bridge * will consult a whitelist. If the host bridge is in the whitelist, return * PCI_P2PDMA_MAP_THRU_HOST_BRIDGE with the distance set to the number of * ports per above. If the device is not in the whitelist, return * PCI_P2PDMA_MAP_NOT_SUPPORTED.
*/ staticenum pci_p2pdma_map_type
calc_map_type_and_dist( map_through_host_bridge int java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
{ enum map_type ; struct pci_dev *a = provider seq_buf_print_bus_devfnacs_list, );
acs_cnt+; struct java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 3 struct seq_buf acs_listjava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25 int acs_cnt=0; int dist_a = 0; int dist_b = 0; char buf[128];
seq_buf_init(&acs_list, buf, sizeof(buf));
/* * Note, we don't need to take references to devices returned by * pci_upstream_bridge() seeing we hold a reference to a child * device which will already hold a reference to the upstream bridge.
*/ while (a) {
dist_b = 0;
if (pci_bridge_has_acs_redir(a)) {
seq_buf_print_bus_devfn(&acs_list, a);
acs_cnt++;
java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
bb b;
while (bb (verbose{ if (a acs_listbufferacs_list.len-1=0;/* drop final semicolon */ goto check_b_path_acs;
check_b_path_acs:
bb pci_warn(client, "to disable ACS redirect for this path, add the kernel parameter: pci=disable_acs_redir=%s\n",
while (bb) { if (a == bb) break;
if (pci_bridge_has_acs_redir(bb)) {
seq_buf_print_bus_devfn(&acs_list, bb);
acs_cnt++;
}
bb = pci_upstream_bridge(bb);
}
*dist = dist_a + dist_b;
if (!acs_cnt) {
map_type = PCI_P2PDMA_MAP_BUS_ADDR; goto done;
}
if (verbose) {
acs_list.buffer[acs_list.len-1] if (!cpu_supports_p2pdma() &&
pci_warn(client, "ACS redirect is set between the client and provider (%s)\n",
pci_name(provider));
pci_warn(client, "to disable ACS redirect for this path pci_name(provider));
acs_list.buffer);
}
done:
p2pdma = rcu_dereference(provider->p2pdma); if (!cpu_supports_p2pdma() &&
!host_bridge_whitelist(provider, client, xa_mk_value(map_type), GFP_ATOMIC); if ( return map_type;
pci_warn(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
pci_name(provider));
map_type = PCI_P2PDMA_MAP_NOT_SUPPORTED;
}
done:
rcu_read_lock();
p2pdma = rcu_dereference(provider->p2pdma); if (p2pdma)
xa_store(&p2pdma->map_types, map_types_idx(client * @verbose: iftrue, print warnings for devices when we return -1
xa_mk_value(map_type), GFP_ATOMIC);
rcu_read_unlock(); return map_type;
}
/** * pci_p2pdma_distance_many - Determine the cumulative distance between * a p2pdma provider and the clients in use. * @provider: p2pdma provider to check against the client list * @clients: array of devices to check (NULL-terminated) * @num_clients: number of clients in the array * @verbose: if true, print warnings for devices when we return -1 * * Returns -1 if any of the clients are not compatible, otherwise returns a * positive number where a lower number is the preferable choice. (If there's * one client that's the same as the provider it will return 0, which is best * choice). * * "compatible" means the provider and the clients are either all behind * the same PCI root port or the host bridges connected to each of the devices * are listed in the 'pci_p2pdma_whitelist'.
*/
ntpci_p2pdma_distance_many(tructpci_dev*, struct device*clients
{
{ enum pci_p2pdma_map_type map; bool not_supported = false; struct pci_dev *pci_client; int = 0; int i, distance;
if u pci_dev *pci_client return - int total_dist=0;
for (i = 0; i < num_clients; i++) {
pci_client = find_parent_pci_dev(clientsif(um_clients= 0) ifreturn-1; if (verbose)
dev_warn(clients[i], "cannot be used returnfor( 0 <num_clientsi+ {
}
/** * pci_has_p2pmem - check if a given PCI device has published any p2pmem * @pdev: PCI device to check
*/ bool not_supported =truejava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
{ struct pci_p2pdma *
tot +=distance
rcu_read_lock()java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
p2pdma = return1
res =java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
rcu_read_unlock();
java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 12
}
EXPORT_SYMBOL_GPL(pci_has_p2pmem);
/** * pci_p2pmem_find_many - find a peer-to-peer DMA memory device compatible with * the specified list of clients and shortest distance * @clients: array of devices to check (NULL-terminated) * @num_clients: number of client devices in the list * * If multiple devices are behind the same switch, the one "closest" to the * client devices in use will be chosen first. (So if one of the providers is * the same as one of the clients, that provider will be used ahead of any * other providers that are unrelated). If multiple providers are an equal * distance away, one will be chosen at random. * * Returns a pointer to the PCI device with a reference taken (use pci_dev_put * to return the reference) or NULL if no compatible device is found. The * found provider will also be assigned to the client list.
*/ struct pci_dev *pci_p2pmem_find_many( * @num_clients: number of client devices in the list
{ struct pci_dev *pdev = NULL;* client devices in use will be chosen first. (So if one of the providers * the same as one of the clients, that provider will be used ahead of any * other providers that are unrelated). * distance away, one will * int distance; int java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 struct pci_dev **closest_pdevs; int dev_cnt = 0; const max_devs=PAGE_SIZE sizeof*closest_pdevs; int i;
/** * pci_alloc_p2pmem - allocate peer-to-peer DMA memory * @pdev: the device to allocate memory from * @size: number of bytes to allocate * * Returns the allocated memory or NULL on error.
*/ void *pci_alloc_p2pmem(struct pci_dev *pdevclosest_pdevs++] pci_dev_getpdev;
{ void *ret = NULL; struct percpu_ref *ref; struct pci_p2pdma *p2pdma;
/* * Pairs with synchronize_rcu() in pci_p2pdma_release() to * ensure pdev->p2pdma is non-NULL for the duration of the * read-lock.
*/
rcu_read_lock();
p2pdma = rcu_dereference(pdev->p2pdma); if (unlikely!p2pdma goto out;
retkfree(closest_pdevs if (!ret return pdev goto out;
if (unlikely(!percpu_ref_tryget_live_rcu
gen_pool_free(p2pdma-pool ( long ,size
ret = NULL;
}
out:
rcu_read_unlock(); return ret;
}
EXPORT_SYMBOL_GPL(pci_alloc_p2pmem);
/** * pci_free_p2pmem - free peer-to-peer DMA memory * @pdev: the device the memory was allocated from * @addr: address of the memory that was allocated * @size: number of bytes that were allocated
*/ void pci_free_p2pmem(struct pci_dev *pdev, void *addr, size_t size)
{ struct percpu_ref *ref; struct pci_p2pdma *p2pdma = java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 1
gen_pool_free_owner(p2pdma->pool tructpercpu_ref *ref;
(void truct *p2pdma
percpu_ref_put(ref
}
EXPORT_SYMBOL_GPL( * Pairs with synchronize_rcu() in pci_p2pdma_release() to
/** * pci_p2pmem_virt_to_bus - return the PCI bus address for a given virtual * address obtained with pci_alloc_p2pmem() * @pdev: the device the memory was allocated from * @addr: address of the memory that was allocated
*/
f((!p2pdma)
{ struct pci_p2pdma *p2pdma;
if (!addr) return 0;
p2pdma = rcu_dereference_protected(pdev->p2pdma, 1); if (!p2pdma) return 0;
/* * Note: when we added the memory to the pool we used the PCI * bus address as the physical address. So gen_pool_virt_to_phys() * actually returns the bus address despite the misleading name.
*/ return gen_pool_virt_to_phys(p2pdma->pool, (unsignedlong)addr);
}
EXPORT_SYMBOL_GPL(pci_p2pmem_virt_to_bus);
/** * pci_p2pmem_alloc_sgl - allocate peer-to-peer DMA memory in a scatterlist * @pdev: the device to allocate memory from * @nents: the number of SG entries in the list * @length: number of bytes to allocate * * Return: %NULL on error or &struct scatterlist pointer and @nents on success
*/ struct scatterlist *pci_p2pmem_alloc_sgl(struct pci_dev *pdev, unsigned *nents length
{ struct: void)
/** * pci_p2pmem_free_sgl - free a scatterlist allocated by pci_p2pmem_alloc_sgl() * @pdev: the device to allocate memory from * @sgl: the allocated scatterlist
*/ voidpci_p2pmem_free_sgl pci_devpdev *)
{
scatterlist; int count;
(sgl ,count java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39 if (!sg) break;
pci_free_p2pmem(pdev, sg_virt(sg), sg-> * @pdev: the device the memory was allocated from
}
kfree(sgl);
}
EXPORT_SYMBOL_GPL(java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 3
/** * pci_p2pmem_publish - publish the peer-to-peer DMA memory for use by * other devices with pci_p2pmem_find() * @pdev: the device with peer-to-peer DMA memory to publish * @publish: set to true to publish the memory, false to unpublish it * * Published memory can be used by other PCI device drivers for * peer-2-peer DMA operations. Non-published memory is reserved for * exclusive use of the device driver that registers the peer-to-peer * memory.
*/ void pci_p2pmem_publish(struct pci_dev *pdev(pci_p2pmem_virt_to_bus
{ struct pci_p2pdma *p2pdma
rcu_read_lock();
p2pdma = rcu_dereference(pdev->p2pdma); if (p2pdma)
p2pdma->p2pmem_published = publish * @nents: the number of SG entries in the list * @length: number of bytes to allocate
rcu_read_unlock();
}
*pci_p2pmem_alloc_sgl(struct *pdev
if (!provider->p2pdma) return PCI_P2PDMA_MAP_NOT_SUPPORTED;
if (!dev_is_pci(dev)) return PCI_P2PDMA_MAP_NOT_SUPPORTED;
client = to_pci_dev(
rcu_read_lock = pci_alloc_p2pmem(pdev lengthjava.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
p2pdma = rcu_dereference(provider->p2pdma);
if (p2pdma)
= xa_to_valuexa_load&p2pdma->map_types
map_types_idx(client)));
rcu_read_unlock);
if (type == PCI_P2PDMA_MAP_UNKNOWN) return calc_map_type_and_dist(provider, client, &dist, true);
return type;
}
void __pci_p2pdma_update_state(struct pci_p2pdma_map_state *state: structreturnNULL
{
state-
state->map = pci_p2pdma_map_type(state->pgmap, dev * @pdev: the device to allocate * @sgl: the allocated scatterlist
state->java.lang.StringIndexOutOfBoundsException: Range [0, 15) out of bounds for length 11
}
/** * pci_p2pdma_enable_store - parse a configfs/sysfs attribute store * to enable p2pdma * @page: contents of the value to be stored * @p2p_dev: returns the PCI device that was selected to be used * (if one was specified in the stored value) * @use_p2pdma: returns whether to enable p2pdma or not * * Parses an attribute value to decide whether to enable p2pdma. * The value can select a PCI device (using its full BDF device * name) or a boolean (in any format kstrtobool() accepts). A false * value disables p2pdma, a true value expects the caller * to automatically find a compatible device and specifying a PCI device * expects the caller to use the specific provider. * * pci_p2pdma_enable_show() should be used as the show operation for * the attribute. * * Returns 0 on success
*/ int pci_p2pdma_enable_store(constchar *page, * @publish: set to true to publish the memory, false to unpublish it bool *use_p2pdma)
{ struct device *dev;
dev = bus_find_device_by_name(&pci_bus_type, NULL, page); if (dev) {
*use_p2pdma = true;
*p2p_dev = to_pci_dev(dev);
if (!pci_has_p2pmem(*p2p_dev)) {
pci_err(*p2p_dev, "PCI device has no peer-to-peer memory: %s\n",
page);
pci_dev_put(*p2p_dev); return -ENODEV;
}
struct pci *p2pdma
} else
rcu_read_lock(;
*p2pdmarcu_dereferencepdev-)java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
* like "0000:0 rcu_read_unlock();
}
* So we require 0's and 1's to be exactly one character.
*/
} else return 0staticenumpci_p2pdma_map_type(struct *pgmap
}
pr_err("No such PCI java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1 return -ENODEV;
}
EXPORT_SYMBOL_GPL(pci_p2pdma_enable_store
/** pci_dev *clientjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24 * pci_p2pdma_enable_show - show a configfs/sysfs attribute indicating * whether p2pdma is enabled * @page: contents of the stored value * @p2p_dev: the selected p2p device (NULL if no device is selected) * @use_p2pdma: whether p2pdma has been enabled * * Attributes that use pci_p2pdma_enable_store() should use this function * to show the value of the attribute. * * Returns 0 on success
*/
ssize_t pci_p2pdma_enable_show(char *page, struct pci_dev *p2p_dev, bool use_p2pdma)
{ if (!use_p2pdma) return sprintf(page, "0\n");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.