> It occurred to me overnight that the existing error handling > in create_gpadl_header() is unnecessarily complicated. Here's > an approach that I think would fix what you have flagged, and > would reduce complexity instead of increasing it. Thoughts? I find this development view interesting. > diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c > index 56f7e06c673e..44b1d5c8dfed 100644 > --- a/drivers/hv/channel.c > +++ b/drivers/hv/channel.c > @@ -336,7 +336,7 @@ static int create_gpadl_header(enum hv_gpadl_type type, void *kbuffer, > sizeof(struct gpa_range) + pfncount * sizeof(u64); > msgheader = kzalloc(msgsize, GFP_KERNEL); > if (!msgheader) > - goto nomem; > + return -ENOMEM; > > INIT_LIST_HEAD(&msgheader->submsglist); > msgheader->msgsize = msgsize; > @@ -386,8 +386,8 @@ static int create_gpadl_header(enum hv_gpadl_type type, void *kbuffer, > list_del(&pos->msglistentry); > kfree(pos); > } > - > - goto nomem; > + kfree(msgheader); > + return -ENOMEM; > } > > msgbody->msgsize = msgsize; > @@ -416,8 +416,8 @@ static int create_gpadl_header(enum hv_gpadl_type type, void *kbuffer, > sizeof(struct vmbus_channel_gpadl_header) + > sizeof(struct gpa_range) + pagecount * sizeof(u64); > msgheader = kzalloc(msgsize, GFP_KERNEL); > - if (msgheader == NULL) > - goto nomem; > + if (!msgheader) > + return -ENOMEM; > > INIT_LIST_HEAD(&msgheader->submsglist); > msgheader->msgsize = msgsize; > @@ -437,10 +437,6 @@ static int create_gpadl_header(enum hv_gpadl_type type, void *kbuffer, > } > > return 0; > -nomem: > - kfree(msgheader); > - kfree(msgbody); > - return -ENOMEM; > } > > /* > Should up to two memory areas still be released after a data processing failure? Regards, Markus