mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 09:12:24 +03:00
gpu: nvgpu: use fixed address mapping for pma byte buffer
Use fixed address mapping for pma byte buffer so that the address of this buffer always fits in 32 bits. This also requires to move unmap sequence to OS specific function since different unmap API is now needed for linux and QNX. Also call nvgpu_prof_free_pma_stream_priv_data() before nvgpu_profiler_free_pma_stream() since former uses mm->perfbuf which is released in later. Bug 2510974 Jira NVGPU-5360 Change-Id: I398b0ca4f96527d6e09c9aacacb4b43c90f5bfc9 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2424691 Reviewed-by: automaticguardword <automaticguardword@nvidia.com> Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> Reviewed-by: Alex Waterman <alexw@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com> GVS: Gerrit_Virtual_Submit
This commit is contained in:
committed by
Alex Waterman
parent
7e6dcade98
commit
c6aae8c049
@@ -189,10 +189,10 @@ int nvgpu_prof_fops_release(struct inode *inode, struct file *filp)
|
||||
"Request to close profiler session with scope %u and profiler handle %u",
|
||||
prof->scope, prof->prof_handle);
|
||||
|
||||
nvgpu_profiler_free(prof);
|
||||
|
||||
nvgpu_prof_free_pma_stream_priv_data(prof_priv);
|
||||
|
||||
nvgpu_profiler_free(prof);
|
||||
|
||||
nvgpu_kfree(g, prof_priv->regops_umd_copy_buf);
|
||||
nvgpu_kfree(g, prof_priv->regops_staging_buf);
|
||||
|
||||
@@ -343,7 +343,7 @@ static int nvgpu_prof_ioctl_alloc_pma_stream(struct nvgpu_profiler_object_priv *
|
||||
struct nvgpu_profiler_object *prof = priv->prof;
|
||||
struct gk20a *g = prof->g;
|
||||
struct mm_gk20a *mm = &g->mm;
|
||||
u64 pma_bytes_available_buffer_offset = 0ULL;
|
||||
u64 pma_bytes_available_buffer_offset;
|
||||
struct dma_buf *dmabuf;
|
||||
void *cpuva;
|
||||
u32 pma_buffer_size;
|
||||
@@ -363,8 +363,15 @@ static int nvgpu_prof_ioctl_alloc_pma_stream(struct nvgpu_profiler_object_priv *
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* PMA available byte buffer GPU_VA needs to fit in 32 bit
|
||||
* register, hence use a fixed GPU_VA to map it.
|
||||
*/
|
||||
pma_bytes_available_buffer_offset = mm->perfbuf.pma_bytes_available_buffer_gpu_va;
|
||||
|
||||
err = nvgpu_vm_map_buffer(mm->perfbuf.vm, args->pma_bytes_available_buffer_fd,
|
||||
&pma_bytes_available_buffer_offset, 0, SZ_4K, 0, 0,
|
||||
&pma_bytes_available_buffer_offset,
|
||||
NVGPU_AS_MAP_BUFFER_FLAGS_FIXED_OFFSET, SZ_4K, 0, 0,
|
||||
0, 0, NULL);
|
||||
if (err != 0) {
|
||||
nvgpu_err(g, "failed to map available bytes buffer");
|
||||
@@ -429,11 +436,20 @@ err_put_vm:
|
||||
static void nvgpu_prof_free_pma_stream_priv_data(struct nvgpu_profiler_object_priv *priv)
|
||||
{
|
||||
struct nvgpu_profiler_object *prof = priv->prof;
|
||||
struct gk20a *g = prof->g;
|
||||
struct mm_gk20a *mm = &g->mm;
|
||||
|
||||
if (priv->pma_bytes_available_buffer_dmabuf == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
nvgpu_vm_unmap(mm->perfbuf.vm, prof->pma_bytes_available_buffer_va, NULL);
|
||||
prof->pma_bytes_available_buffer_va = 0U;
|
||||
|
||||
nvgpu_vm_unmap(mm->perfbuf.vm, prof->pma_buffer_va, NULL);
|
||||
prof->pma_buffer_va = 0U;
|
||||
prof->pma_buffer_size = 0U;
|
||||
|
||||
dma_buf_vunmap(priv->pma_bytes_available_buffer_dmabuf,
|
||||
prof->pma_bytes_available_buffer_cpuva);
|
||||
dma_buf_put(priv->pma_bytes_available_buffer_dmabuf);
|
||||
@@ -459,8 +475,8 @@ static int nvgpu_prof_ioctl_free_pma_stream(struct nvgpu_profiler_object_priv *p
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
nvgpu_profiler_free_pma_stream(prof);
|
||||
nvgpu_prof_free_pma_stream_priv_data(priv);
|
||||
nvgpu_profiler_free_pma_stream(prof);
|
||||
|
||||
nvgpu_log(g, gpu_dbg_prof, "Request to free PMA stream for handle %u completed",
|
||||
prof->prof_handle);
|
||||
|
||||
Reference in New Issue
Block a user