mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-24 10:34:43 +03:00
gpu: nvgpu: container_of() changes to mm code
The container_of() macro used in nvgpu produces the following
set of MISRA required rule violations:
* Rule 11.3 : A cast shall not be performed between a pointer to
object type and a pointer to a different object type.
* Rule 11.8 : A cast shall not remove any const or volatile
qualification from the type pointed to be a pointer.
* Rule 20.7 : Expressions resulting from the expansion of macro
parameters shall be enclosed in parentheses
Using the same modified implementation of container_of() as that
used in the nvgpu_list_node/nvgpu_rbtree_node routines eliminates
the Rule 11.8 and Rule 20.7 violations and exchanges the Rule 11.3
violation with an advisory Rule 11.4 violation.
This patch uses that same equivalent implementation in two new
(static) functions that are used to replace references to
container_of() references in vm.c:
* nvgpu_mapped_buf_from_ref
* vm_gk20a_from_ref
The implementation of the following routine has also been updated
using the same approach to eliminate the direct reference to
container_of():
* gk20a_from_as
It should be noted that replacement functions still contain
potentially dangerous (and non-MISRA compliant code) and that it is
expected that deviation requests will be filed for the new advisory
rule violations accordingly.
JIRA NVGPU-782
Change-Id: I530f8d0cbe37445535b82578953eb5193ccf682c
Signed-off-by: Scott Long <scottl@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1989570
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com>
Reviewed-by: svc-mobile-misra <svc-mobile-misra@nvidia.com>
Reviewed-by: svc-misra-checker <svc-misra-checker@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Konsta Holtta <kholtta@nvidia.com>
Reviewed-by: Adeel Raza <araza@nvidia.com>
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
committed by
mobile promotions
parent
e492834a07
commit
69e5b2a38c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* GK20A Address Spaces
|
||||
*
|
||||
* Copyright (c) 2011-2018, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2011-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -183,5 +183,5 @@ release_fail:
|
||||
|
||||
struct gk20a *gk20a_from_as(struct gk20a_as *as)
|
||||
{
|
||||
return container_of(as, struct gk20a, as);
|
||||
return (struct gk20a *)((uintptr_t)as - offsetof(struct gk20a, as));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2017-2018, NVIDIA CORPORATION. All rights reserved.
|
||||
* Copyright (c) 2017-2019, NVIDIA CORPORATION. All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -664,9 +664,15 @@ static void nvgpu_vm_remove(struct vm_gk20a *vm)
|
||||
nvgpu_kfree(g, vm);
|
||||
}
|
||||
|
||||
static struct vm_gk20a *vm_gk20a_from_ref(struct nvgpu_ref *ref)
|
||||
{
|
||||
return (struct vm_gk20a *)
|
||||
((uintptr_t)ref - offsetof(struct vm_gk20a, ref));
|
||||
}
|
||||
|
||||
static void nvgpu_vm_remove_ref(struct nvgpu_ref *ref)
|
||||
{
|
||||
struct vm_gk20a *vm = container_of(ref, struct vm_gk20a, ref);
|
||||
struct vm_gk20a *vm = vm_gk20a_from_ref(ref);
|
||||
|
||||
nvgpu_vm_remove(vm);
|
||||
}
|
||||
@@ -1150,6 +1156,12 @@ static void nvgpu_vm_do_unmap(struct nvgpu_mapped_buf *mapped_buffer,
|
||||
nvgpu_kfree(g, mapped_buffer);
|
||||
}
|
||||
|
||||
static struct nvgpu_mapped_buf *nvgpu_mapped_buf_from_ref(struct nvgpu_ref *ref)
|
||||
{
|
||||
return (struct nvgpu_mapped_buf *)
|
||||
((uintptr_t)ref - offsetof(struct nvgpu_mapped_buf, ref));
|
||||
}
|
||||
|
||||
/*
|
||||
* Note: the update_gmmu_lock of the VM that owns this buffer must be locked
|
||||
* before calling nvgpu_ref_put() with this function as the unref function
|
||||
@@ -1157,8 +1169,7 @@ static void nvgpu_vm_do_unmap(struct nvgpu_mapped_buf *mapped_buffer,
|
||||
*/
|
||||
void nvgpu_vm_unmap_ref_internal(struct nvgpu_ref *ref)
|
||||
{
|
||||
struct nvgpu_mapped_buf *mapped_buffer =
|
||||
container_of(ref, struct nvgpu_mapped_buf, ref);
|
||||
struct nvgpu_mapped_buf *mapped_buffer = nvgpu_mapped_buf_from_ref(ref);
|
||||
|
||||
nvgpu_vm_do_unmap(mapped_buffer, mapped_buffer->vm->kref_put_batch);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user