In case of failing on rss_data->rss_key allocation the function is
freeing vport without freeing earlier allocated q_vector_idxs. Fix it.

Move from freeing in error branch to goto scheme.

Fixes: 95af467d9a4e ("idpf: configure resources for RX queues")
Reviewed-by: Pavan Kumar Linga <[email protected]>
Reviewed-by: Aleksandr Loktionov <[email protected]>
Suggested-by: Pavan Kumar Linga <[email protected]>
Signed-off-by: Michal Swiatkowski <[email protected]>
---
 drivers/net/ethernet/intel/idpf/idpf_lib.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/intel/idpf/idpf_lib.c 
b/drivers/net/ethernet/intel/idpf/idpf_lib.c
index aa755dedb41d..329ba53e86fd 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_lib.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_lib.c
@@ -1132,11 +1132,9 @@ static struct idpf_vport *idpf_vport_alloc(struct 
idpf_adapter *adapter,
 
        num_max_q = max(max_q->max_txq, max_q->max_rxq);
        vport->q_vector_idxs = kcalloc(num_max_q, sizeof(u16), GFP_KERNEL);
-       if (!vport->q_vector_idxs) {
-               kfree(vport);
+       if (!vport->q_vector_idxs)
+               goto free_vport;
 
-               return NULL;
-       }
        idpf_vport_init(vport, max_q);
 
        /* This alloc is done separate from the LUT because it's not strictly
@@ -1146,11 +1144,9 @@ static struct idpf_vport *idpf_vport_alloc(struct 
idpf_adapter *adapter,
         */
        rss_data = &adapter->vport_config[idx]->user_config.rss_data;
        rss_data->rss_key = kzalloc(rss_data->rss_key_size, GFP_KERNEL);
-       if (!rss_data->rss_key) {
-               kfree(vport);
+       if (!rss_data->rss_key)
+               goto free_vector_idxs;
 
-               return NULL;
-       }
        /* Initialize default rss key */
        netdev_rss_key_fill((void *)rss_data->rss_key, rss_data->rss_key_size);
 
@@ -1163,6 +1159,13 @@ static struct idpf_vport *idpf_vport_alloc(struct 
idpf_adapter *adapter,
        adapter->next_vport = idpf_get_free_slot(adapter);
 
        return vport;
+
+free_vector_idxs:
+       kfree(vport->q_vector_idxs);
+free_vport:
+       kfree(vport);
+
+       return NULL;
 }
 
 /**
-- 
2.42.0

Reply via email to