Re: [Intel-wired-lan] [PATCH RFT net-next 2/2] idpf: remove __free usage in idpf_virtchnl
Jeff Johnson via Intel-wired-lan <[email protected]> Tue, 4 Aug 2026 15:54:55 -0700
| Newsgroups | org.osuosl.intel-wired-lan,org.kernel.vger.linux-kernel,org.kernel.vger.netdev |
|---|---|
| Message-ID | <[email protected]> |
On 11/16/2025 7:56 AM, Ally Heev wrote: > usage of cleanup attributes is discouraged in net [1], achieve cleanup > using goto. In this patch though, only uninitialized pointers with __free > attribute are cleaned as they can cause undefined behavior when they > go out of scope > > Suggested-by: Simon Horman <[email protected]> > Reported-by: Dan Carpenter <[email protected]> > Closes: https://lore.kernel.org/all/[email protected]/ > Signed-off-by: Ally Heev <[email protected]> > > [1] https://docs.kernel.org/process/maintainer-netdev.html#using-device-managed-and-cleanup-h-constructs <SMH> If using __free() *correctly* gives more readable code, why wouldn't we do it? The only problem with this function is that it doesn't follow the guidance from cleanup.h: * the recommendation is to always define and assign variables in one * statement and not group variable definitions at the top of the * function when __free() is used. > > Signed-off-by: Ally Heev <[email protected]> > --- > drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 28 +++++++++++++++++-------- > 1 file changed, 19 insertions(+), 9 deletions(-) > > diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c > index cbb5fa30f5a0ec778c1ee30470da3ca21cc1af24..5b2bf8c3205bc1ea0746f78afa2a24f3f8ad2a8c 100644 > --- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c > +++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c > @@ -1012,7 +1012,7 @@ static int idpf_send_get_caps_msg(struct idpf_adapter *adapter) > */ > static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter) > { > - struct virtchnl2_get_lan_memory_regions *rcvd_regions __free(kfree); > + struct virtchnl2_get_lan_memory_regions *rcvd_regions = NULL; > struct idpf_vc_xn_params xn_params = { > .vc_op = VIRTCHNL2_OP_GET_LAN_MEMORY_REGIONS, > .recv_buf.iov_len = IDPF_CTLQ_MAX_BUF_LEN, > @@ -1029,21 +1029,29 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter) > > xn_params.recv_buf.iov_base = rcvd_regions; > reply_sz = idpf_vc_xn_exec(adapter, &xn_params); > - if (reply_sz < 0) > - return reply_sz; > + if (reply_sz < 0) { > + err = reply_sz; > + goto out; > + } > > num_regions = le16_to_cpu(rcvd_regions->num_memory_regions); > size = struct_size(rcvd_regions, mem_reg, num_regions); > - if (reply_sz < size) > - return -EIO; > + if (reply_sz < size) { > + err = -EIO; > + goto out; > + } > > - if (size > IDPF_CTLQ_MAX_BUF_LEN) > - return -EINVAL; > + if (size > IDPF_CTLQ_MAX_BUF_LEN) { > + err = -EINVAL; > + goto out; > + } > > hw = &adapter->hw; > hw->lan_regs = kcalloc(num_regions, sizeof(*hw->lan_regs), GFP_KERNEL); > - if (!hw->lan_regs) > - return -ENOMEM; > + if (!hw->lan_regs) { > + err = -ENOMEM; > + goto out; > + } > > for (int i = 0; i < num_regions; i++) { > hw->lan_regs[i].addr_len = > @@ -1053,6 +1061,8 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter) > } > hw->num_lan_regs = num_regions; > > +out: > + kfree(rcvd_regions); > return err; > } > >