On 2019-04-02 10:29 a.m., Paul E. McKenney wrote: > Having DEFINE_SRCU() or DEFINE_STATIC_SRCU() in a loadable module > requires that the size of the reserved region be increased, which is > not something we really want to be doing. This commit therefore removes > the DEFINE_STATIC_SRCU() from drivers/gpu/drm/amd/amdkfd/kfd_process.c in > favor of defining kfd_processes_srcu as a simple srcu_struct, initializing > it in amdgpu_amdkfd_init(), and cleaning it up in amdgpu_amdkfd_fini(). > > Reported-by: kbuild test robot > Signed-off-by: Paul E. McKenney > Tested-by: kbuild test robot > Cc: Oded Gabbay > Cc: Alex Deucher > Cc: "Christian König" Cc: "David (ChunMing) Zhou" > Cc: David Airlie > Cc: Daniel Vetter > Cc: Tejun Heo > Cc: > Cc: > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c | 5 +++++ > drivers/gpu/drm/amd/amdkfd/kfd_process.c | 2 +- > 2 files changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c > index fe1d7368c1e6..eadb20dee867 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c > @@ -28,6 +28,8 @@ > #include > #include > > +extern struct srcu_struct kfd_processes_srcu; > + > static const unsigned int compute_vmid_bitmap = 0xFF00; > > /* Total memory size in system memory and all GPU VRAM. Used to > @@ -40,6 +42,8 @@ int amdgpu_amdkfd_init(void) > struct sysinfo si; > int ret; > > + ret = init_srcu_struct(&kfd_processes_srcu); > + WARN_ON(ret); kfd_processes_srcu only exists if kfd_process.c is compiled in. That depends on CONFIG_HSA_AMD. So this should at least move into #ifdef a few lines below. However, it would be cleaner to move this initialization into kfd_init in kfd_module.c, or better yet, into kfd_process_create_wq in kfd_process.c. Then kfd_process_create_wq should be renamed to something more generic, such as kfd_process_init. > si_meminfo(&si); > amdgpu_amdkfd_total_mem_size = si.totalram - si.totalhigh; > amdgpu_amdkfd_total_mem_size *= si.mem_unit; > @@ -57,6 +61,7 @@ int amdgpu_amdkfd_init(void) > void amdgpu_amdkfd_fini(void) > { > kgd2kfd_exit(); > + cleanup_srcu_struct(&kfd_processes_srcu); Similarly, this would be cleaner in kfd_exit in kfd_module.c or kfd_process_destroy_wq in kfd_process.c, with that function similarly renamed to kfd_process_fini. I'm attaching a revised patch. It's only compile tested. Regards,   Felix > } > > void amdgpu_amdkfd_device_probe(struct amdgpu_device *adev) > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c > index 4bdae78bab8e..98b694068b8a 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c > @@ -47,7 +47,7 @@ struct mm_struct; > DEFINE_HASHTABLE(kfd_processes_table, KFD_PROCESS_TABLE_SIZE); > static DEFINE_MUTEX(kfd_processes_mutex); > > -DEFINE_SRCU(kfd_processes_srcu); > +struct srcu_struct kfd_processes_srcu; > > /* For process termination handling */ > static struct workqueue_struct *kfd_process_wq;