diff --git a/drivers/gpu/nvgpu/common/nvgpu_common.c b/drivers/gpu/nvgpu/common/nvgpu_common.c index 843228e9b..65d940926 100644 --- a/drivers/gpu/nvgpu/common/nvgpu_common.c +++ b/drivers/gpu/nvgpu/common/nvgpu_common.c @@ -54,7 +54,7 @@ static void nvgpu_init_vars(struct gk20a *g) INIT_LIST_HEAD(&g->pending_sema_waits); nvgpu_raw_spinlock_init(&g->pending_sema_waits_lock); - INIT_LIST_HEAD(&g->profiler_objects); + nvgpu_init_list_node(&g->profiler_objects); } static void nvgpu_init_timeout(struct gk20a *g) diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c index 1eaca686f..d7f8cebab 100644 --- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.c @@ -430,15 +430,15 @@ int dbg_unbind_single_channel_gk20a(struct dbg_session_gk20a *dbg_s, /* If there's a profiler ctx reservation record associated with this * session/channel pair, release it. */ - list_for_each_entry_safe(prof_obj, tmp_obj, &g->profiler_objects, - prof_obj_entry) { + nvgpu_list_for_each_entry_safe(prof_obj, tmp_obj, &g->profiler_objects, + dbg_profiler_object_data, prof_obj_entry) { if ((prof_obj->session_id == dbg_s->id) && (prof_obj->ch->hw_chid == chid)) { if (prof_obj->has_reservation) { g->ops.dbg_session_ops. release_profiler_reservation(dbg_s, prof_obj); } - list_del(&prof_obj->prof_obj_entry); + nvgpu_list_del(&prof_obj->prof_obj_entry); nvgpu_kfree(g, prof_obj); } } @@ -536,13 +536,13 @@ int gk20a_dbg_gpu_dev_release(struct inode *inode, struct file *filp) /* Per-context profiler objects were released when we called * dbg_unbind_all_channels. We could still have global ones. */ - list_for_each_entry_safe(prof_obj, tmp_obj, &g->profiler_objects, - prof_obj_entry) { + nvgpu_list_for_each_entry_safe(prof_obj, tmp_obj, &g->profiler_objects, + dbg_profiler_object_data, prof_obj_entry) { if (prof_obj->session_id == dbg_s->id) { if (prof_obj->has_reservation) g->ops.dbg_session_ops. release_profiler_reservation(dbg_s, prof_obj); - list_del(&prof_obj->prof_obj_entry); + nvgpu_list_del(&prof_obj->prof_obj_entry); nvgpu_kfree(g, prof_obj); } } @@ -1555,9 +1555,9 @@ static int nvgpu_ioctl_allocate_profiler_object( /* Return handle to client */ args->profiler_handle = prof_obj->prof_handle; - INIT_LIST_HEAD(&prof_obj->prof_obj_entry); + nvgpu_init_list_node(&prof_obj->prof_obj_entry); - list_add(&prof_obj->prof_obj_entry, &g->profiler_objects); + nvgpu_list_add(&prof_obj->prof_obj_entry, &g->profiler_objects); clean_up: nvgpu_mutex_release(&g->dbg_sessions_lock); return err; @@ -1578,8 +1578,8 @@ static int nvgpu_ioctl_free_profiler_object( nvgpu_mutex_acquire(&g->dbg_sessions_lock); /* Remove profiler object from the list, if a match is found */ - list_for_each_entry_safe(prof_obj, tmp_obj, &g->profiler_objects, - prof_obj_entry) { + nvgpu_list_for_each_entry_safe(prof_obj, tmp_obj, &g->profiler_objects, + dbg_profiler_object_data, prof_obj_entry) { if (prof_obj->prof_handle == args->profiler_handle) { if (prof_obj->session_id != dbg_s->id) { gk20a_err(dev_from_gk20a(g), @@ -1591,7 +1591,7 @@ static int nvgpu_ioctl_free_profiler_object( if (prof_obj->has_reservation) g->ops.dbg_session_ops. release_profiler_reservation(dbg_s, prof_obj); - list_del(&prof_obj->prof_obj_entry); + nvgpu_list_del(&prof_obj->prof_obj_entry); nvgpu_kfree(g, prof_obj); obj_found = true; break; @@ -1614,7 +1614,8 @@ static struct dbg_profiler_object_data *find_matching_prof_obj( struct gk20a *g = dbg_s->g; struct dbg_profiler_object_data *prof_obj; - list_for_each_entry(prof_obj, &g->profiler_objects, prof_obj_entry) { + nvgpu_list_for_each_entry(prof_obj, &g->profiler_objects, + dbg_profiler_object_data, prof_obj_entry) { if (prof_obj->prof_handle == profiler_handle) { if (prof_obj->session_id != dbg_s->id) { gk20a_err(dev_from_gk20a(g), @@ -1727,8 +1728,8 @@ static int nvgpu_profiler_reserve_acquire(struct dbg_session_gk20a *dbg_s, */ int my_tsgid = my_prof_obj->ch->tsgid; - list_for_each_entry(prof_obj, &g->profiler_objects, - prof_obj_entry) { + nvgpu_list_for_each_entry(prof_obj, &g->profiler_objects, + dbg_profiler_object_data, prof_obj_entry) { if (prof_obj->has_reservation && (prof_obj->ch->tsgid == my_tsgid)) { gk20a_err(dev_from_gk20a(g), @@ -1751,8 +1752,8 @@ static int nvgpu_profiler_reserve_acquire(struct dbg_session_gk20a *dbg_s, */ struct channel_gk20a *my_ch = my_prof_obj->ch; - list_for_each_entry(prof_obj, &g->profiler_objects, - prof_obj_entry) { + nvgpu_list_for_each_entry(prof_obj, &g->profiler_objects, + dbg_profiler_object_data, prof_obj_entry) { if (prof_obj->has_reservation && (prof_obj->ch == my_ch)) { gk20a_err(dev_from_gk20a(g), diff --git a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h index beb57664e..e48d80504 100644 --- a/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/dbg_gpu_gk20a.h @@ -112,7 +112,14 @@ struct dbg_profiler_object_data { u32 prof_handle; struct channel_gk20a *ch; bool has_reservation; - struct list_head prof_obj_entry; + struct nvgpu_list_node prof_obj_entry; +}; + +static inline struct dbg_profiler_object_data * +dbg_profiler_object_data_from_prof_obj_entry(struct nvgpu_list_node *node) +{ + return (struct dbg_profiler_object_data *) + ((uintptr_t)node - offsetof(struct dbg_profiler_object_data, prof_obj_entry)); }; int dbg_unbind_single_channel_gk20a(struct dbg_session_gk20a *dbg_s, diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 4fa8b76f5..bfb8b204a 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -1023,7 +1023,7 @@ struct gk20a { u32 dbg_regops_tmp_buf_ops; /* For profiler reservations */ - struct list_head profiler_objects; + struct nvgpu_list_node profiler_objects; bool global_profiler_reservation_held; int profiler_reservation_count; diff --git a/drivers/gpu/nvgpu/vgpu/vgpu.c b/drivers/gpu/nvgpu/vgpu/vgpu.c index 871f08745..54078bcaa 100644 --- a/drivers/gpu/nvgpu/vgpu/vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/vgpu.c @@ -260,7 +260,7 @@ static int vgpu_init_support(struct platform_device *pdev) nvgpu_mutex_init(&g->dbg_sessions_lock); nvgpu_mutex_init(&g->client_lock); - INIT_LIST_HEAD(&g->profiler_objects); + nvgpu_init_list_node(&g->profiler_objects); g->dbg_regops_tmp_buf = nvgpu_kzalloc(g, SZ_4K); if (!g->dbg_regops_tmp_buf) {