> On Jan 18, 2017, at 4:15 AM, Yong Wang <yongw...@vmware.com> wrote: > >> -----Original Message----- >> From: Nick Zhang [mailto:n...@opencloud.tech <mailto:n...@opencloud.tech>] >> Sent: Sunday, January 8, 2017 7:00 PM >> To: Yong Wang <yongw...@vmware.com <mailto:yongw...@vmware.com>> >> Cc: ferruh.yi...@intel.com <mailto:ferruh.yi...@intel.com>; dev@dpdk.org >> <mailto:dev@dpdk.org>; Nick Zhang <n...@opencloud.tech >> <mailto:n...@opencloud.tech>> >> Subject: [PATCH v3 1/4] vmxnet3: Avoid memory leak in >> vmxnet3_dev_rx_queue_setup. >> >> This patch will check the "nb_desc" parameter for rx queue. >> Rx vmxnet rings length should be between 128-4096. >> The patch will release the rxq and re-allocation it soon >> for different "nb_desc". >> >> Signed-off-by: Nick Zhang <n...@opencloud.tech> >> --- >> drivers/net/vmxnet3/vmxnet3_rxtx.c | 30 ++++++++++++++++++------------ >> 1 file changed, 18 insertions(+), 12 deletions(-) >> >> diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c >> b/drivers/net/vmxnet3/vmxnet3_rxtx.c >> index b109168..e77374f 100644 >> --- a/drivers/net/vmxnet3/vmxnet3_rxtx.c >> +++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c >> @@ -926,6 +926,21 @@ >> >> PMD_INIT_FUNC_TRACE(); >> >> + /* Rx vmxnet rings length should be between 128-4096 */ >> + if (nb_desc < VMXNET3_DEF_RX_RING_SIZE) { >> + PMD_INIT_LOG(ERR, "VMXNET3 Rx Ring Size Min: 128"); >> + return -EINVAL; >> + } else if (nb_desc > VMXNET3_RX_RING_MAX_SIZE) { >> + PMD_INIT_LOG(ERR, "VMXNET3 Rx Ring Size Max: 4096"); >> + return -EINVAL; >> + } >> + >> + /* Free memory prior to re-allocation if needed. */ >> + if (dev->data->rx_queues[queue_idx] != NULL) { >> + vmxnet3_dev_rx_queue_release(dev->data->rx_queues[queue_idx]); > > Currently vmxnet3_dev_rx_queue_release() does not free device ring memory. > As a result, the same device ring memory allocated based on the previous > descriptor size will be used and that should also explain why you are > observing seg fault with an increased ring size. If you handle the device > ring memory free in vmxnet3_dev_rx_queue_release(), I think the > pre-allocation of ring with max size will not be needed any more.
Yes, we should not free the pre-allocation of ring, but alloc only once ring with max size. I will submit v4. Thank you.