mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 17:36:20 +03:00
gpu: nvgpu: fix job count calculation for non-pow2
The CIRC_SPACE and CIRC_CNT macros work as expected when the buffer size is a power of two. The userspace-supplied number of inflight jobs is not necessarily so. Compare the get and put pointers manually. Jira NVGPU-4548 Change-Id: Ifa7bd6d78f82ec8efcac21fcca391053a2f6f311 Signed-off-by: Konsta Hölttä <kholtta@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2328572 (cherry picked from commit 33dffa1cfb142eea0f28474566c31b632eee04f5) Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2331340 Reviewed-by: automaticguardword <automaticguardword@nvidia.com> Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> Reviewed-by: svc-mobile-cert <svc-mobile-cert@nvidia.com> Reviewed-by: Alex Waterman <alexw@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> GVS: Gerrit_Virtual_Submit Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
committed by
Alex Waterman
parent
47c3d4582c
commit
0b70fff5db
@@ -45,6 +45,8 @@ int nvgpu_channel_alloc_job(struct nvgpu_channel *c,
|
||||
if (nvgpu_channel_is_prealloc_enabled(c)) {
|
||||
unsigned int put = c->joblist.pre_alloc.put;
|
||||
unsigned int get = c->joblist.pre_alloc.get;
|
||||
unsigned int next = (put + 1) % c->joblist.pre_alloc.length;
|
||||
bool full = next == get;
|
||||
|
||||
/*
|
||||
* ensure all subsequent reads happen after reading get.
|
||||
@@ -53,7 +55,7 @@ int nvgpu_channel_alloc_job(struct nvgpu_channel *c,
|
||||
*/
|
||||
nvgpu_smp_rmb();
|
||||
|
||||
if (CIRC_SPACE(put, get, c->joblist.pre_alloc.length) != 0U) {
|
||||
if (!full) {
|
||||
*job_out = &c->joblist.pre_alloc.jobs[put];
|
||||
} else {
|
||||
nvgpu_warn(c->g,
|
||||
@@ -157,7 +159,7 @@ bool nvgpu_channel_joblist_is_empty(struct nvgpu_channel *c)
|
||||
unsigned int get = c->joblist.pre_alloc.get;
|
||||
unsigned int put = c->joblist.pre_alloc.put;
|
||||
|
||||
return (CIRC_CNT(put, get, c->joblist.pre_alloc.length) == 0U);
|
||||
return get == put;
|
||||
}
|
||||
|
||||
return nvgpu_list_empty(&c->joblist.dynamic.jobs);
|
||||
|
||||
Reference in New Issue
Block a user