Message ID | 20200706054732.99387-3-gshan@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Refactor SDEI client driver | expand |
Hi Gavin, On 06/07/2020 06:47, Gavin Shan wrote: > The failing path in sdei_event_create() is to free SDEI event and > return the corresponding error. This introduces common block of > code for that to avoid duplicated logics. By replacing it with slightly different duplicated logic? If there were some kind of state to unwind here, I'd agree a single block to return from is less likely to have bugs. Until then, this change is just churn. > By the way, the function > scoped variables are also reordered according to their importance. Please: Never do this. The 'order' is usually to make it easier to resolve merge conflicts. If two people add an entry, at the same time. Its normally a 'fir' tree, and all that really matters is its consistent. This change is just churn. No Thanks, James
Hi James, On 7/22/20 6:40 AM, James Morse wrote: > On 06/07/2020 06:47, Gavin Shan wrote: >> The failing path in sdei_event_create() is to free SDEI event and >> return the corresponding error. This introduces common block of >> code for that to avoid duplicated logics. > > By replacing it with slightly different duplicated logic? > If there were some kind of state to unwind here, I'd agree a single block to return from > is less likely to have bugs. Until then, this change is just churn. > The problem is there are multiple calls to kfree(event) in sdei_event_create(). It's prone to cause memory leakage when more code is added to the failing path. To have common/single block to free @event and return errno can avoid the situation as you mentioned. I will adjust the commit log to make it more explicit in v2. > >> By the way, the function >> scoped variables are also reordered according to their importance. > > Please: Never do this. > > The 'order' is usually to make it easier to resolve merge conflicts. If two people add an > entry, at the same time. Its normally a 'fir' tree, and all that really matters is its > consistent. This change is just churn. > > > No Thanks, > Ok. I will drop this part of change in v2. Thanks, Gavin
diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c index 415c243a8e65..a75212a743d3 100644 --- a/drivers/firmware/arm_sdei.c +++ b/drivers/firmware/arm_sdei.c @@ -182,41 +182,39 @@ static struct sdei_event *sdei_event_create(u32 event_num, sdei_event_callback *cb, void *cb_arg) { - int err; - u64 result; struct sdei_event *event; struct sdei_registered_event *reg; + u64 result; + int err; lockdep_assert_held(&sdei_events_lock); event = kzalloc(sizeof(*event), GFP_KERNEL); - if (!event) - return ERR_PTR(-ENOMEM); + if (!event) { + err = -ENOMEM; + goto fail; + } INIT_LIST_HEAD(&event->list); event->event_num = event_num; err = sdei_api_event_get_info(event_num, SDEI_EVENT_INFO_EV_PRIORITY, &result); - if (err) { - kfree(event); - return ERR_PTR(err); - } + if (err) + goto fail; event->priority = result; err = sdei_api_event_get_info(event_num, SDEI_EVENT_INFO_EV_TYPE, &result); - if (err) { - kfree(event); - return ERR_PTR(err); - } + if (err) + goto fail; event->type = result; if (event->type == SDEI_EVENT_TYPE_SHARED) { reg = kzalloc(sizeof(*reg), GFP_KERNEL); if (!reg) { - kfree(event); - return ERR_PTR(-ENOMEM); + err = -ENOMEM; + goto fail; } reg->event_num = event_num; @@ -231,8 +229,8 @@ static struct sdei_event *sdei_event_create(u32 event_num, regs = alloc_percpu(struct sdei_registered_event); if (!regs) { - kfree(event); - return ERR_PTR(-ENOMEM); + err = -ENOMEM; + goto fail; } for_each_possible_cpu(cpu) { @@ -252,6 +250,9 @@ static struct sdei_event *sdei_event_create(u32 event_num, spin_unlock(&sdei_list_lock); return event; +fail: + kfree(event); + return ERR_PTR(err); } static void sdei_event_destroy_llocked(struct sdei_event *event)
The failing path in sdei_event_create() is to free SDEI event and return the corresponding error. This introduces common block of code for that to avoid duplicated logics. By the way, the function scoped variables are also reordered according to their importance. Signed-off-by: Gavin Shan <gshan@redhat.com> --- drivers/firmware/arm_sdei.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-)