diff options
author | Jacob Keller <jacob.e.keller@intel.com> | 2017-02-06 17:38:41 -0500 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2017-03-20 19:45:20 -0400 |
commit | e5187ee3ee9a95b1aa32a9a3daf4f07a9f89c20c (patch) | |
tree | 6607861cacb221079be19002d472235f2a0c43ef | |
parent | 01016da1e58136518252822738fe833c662df916 (diff) |
i40e: return immediately when failing to add fdir filter
Instead of setting err=true and checking this to determine when to free
the raw_packet near the end of the function, simply kfree and return
immediately. The resulting code is a bit cleaner and has one less
variable. This also resolves a subtle bug in the ipv4 case which could
fail to add the first filter and then never free the memory, resulting
in a small memory leak.
Change-ID: I7583aac033481dc794b4acaa14445059c8930ff1
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Reviewed-by: Avinash Dayanand <avinash.dayanand@intel.com>
Reviewed-by: Alan Brady <alan.brady@intel.com>
Reviewed-by: Mitch Williams <mitch.a.williams@intel.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_txrx.c | 33 |
1 files changed, 14 insertions, 19 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c index c4d3a40a3f10..005257b4f218 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c +++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c | |||
@@ -203,7 +203,6 @@ static int i40e_add_del_fdir_udpv4(struct i40e_vsi *vsi, | |||
203 | struct i40e_pf *pf = vsi->back; | 203 | struct i40e_pf *pf = vsi->back; |
204 | struct udphdr *udp; | 204 | struct udphdr *udp; |
205 | struct iphdr *ip; | 205 | struct iphdr *ip; |
206 | bool err = false; | ||
207 | u8 *raw_packet; | 206 | u8 *raw_packet; |
208 | int ret; | 207 | int ret; |
209 | static char packet[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0, | 208 | static char packet[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, 0, |
@@ -230,7 +229,9 @@ static int i40e_add_del_fdir_udpv4(struct i40e_vsi *vsi, | |||
230 | dev_info(&pf->pdev->dev, | 229 | dev_info(&pf->pdev->dev, |
231 | "PCTYPE:%d, Filter command send failed for fd_id:%d (ret = %d)\n", | 230 | "PCTYPE:%d, Filter command send failed for fd_id:%d (ret = %d)\n", |
232 | fd_data->pctype, fd_data->fd_id, ret); | 231 | fd_data->pctype, fd_data->fd_id, ret); |
233 | err = true; | 232 | /* Free the packet buffer since it wasn't added to the ring */ |
233 | kfree(raw_packet); | ||
234 | return -EOPNOTSUPP; | ||
234 | } else if (I40E_DEBUG_FD & pf->hw.debug_mask) { | 235 | } else if (I40E_DEBUG_FD & pf->hw.debug_mask) { |
235 | if (add) | 236 | if (add) |
236 | dev_info(&pf->pdev->dev, | 237 | dev_info(&pf->pdev->dev, |
@@ -241,10 +242,8 @@ static int i40e_add_del_fdir_udpv4(struct i40e_vsi *vsi, | |||
241 | "Filter deleted for PCTYPE %d loc = %d\n", | 242 | "Filter deleted for PCTYPE %d loc = %d\n", |
242 | fd_data->pctype, fd_data->fd_id); | 243 | fd_data->pctype, fd_data->fd_id); |
243 | } | 244 | } |
244 | if (err) | ||
245 | kfree(raw_packet); | ||
246 | 245 | ||
247 | return err ? -EOPNOTSUPP : 0; | 246 | return 0; |
248 | } | 247 | } |
249 | 248 | ||
250 | #define I40E_TCPIP_DUMMY_PACKET_LEN 54 | 249 | #define I40E_TCPIP_DUMMY_PACKET_LEN 54 |
@@ -263,7 +262,6 @@ static int i40e_add_del_fdir_tcpv4(struct i40e_vsi *vsi, | |||
263 | struct i40e_pf *pf = vsi->back; | 262 | struct i40e_pf *pf = vsi->back; |
264 | struct tcphdr *tcp; | 263 | struct tcphdr *tcp; |
265 | struct iphdr *ip; | 264 | struct iphdr *ip; |
266 | bool err = false; | ||
267 | u8 *raw_packet; | 265 | u8 *raw_packet; |
268 | int ret; | 266 | int ret; |
269 | /* Dummy packet */ | 267 | /* Dummy packet */ |
@@ -305,12 +303,13 @@ static int i40e_add_del_fdir_tcpv4(struct i40e_vsi *vsi, | |||
305 | 303 | ||
306 | fd_data->pctype = I40E_FILTER_PCTYPE_NONF_IPV4_TCP; | 304 | fd_data->pctype = I40E_FILTER_PCTYPE_NONF_IPV4_TCP; |
307 | ret = i40e_program_fdir_filter(fd_data, raw_packet, pf, add); | 305 | ret = i40e_program_fdir_filter(fd_data, raw_packet, pf, add); |
308 | |||
309 | if (ret) { | 306 | if (ret) { |
310 | dev_info(&pf->pdev->dev, | 307 | dev_info(&pf->pdev->dev, |
311 | "PCTYPE:%d, Filter command send failed for fd_id:%d (ret = %d)\n", | 308 | "PCTYPE:%d, Filter command send failed for fd_id:%d (ret = %d)\n", |
312 | fd_data->pctype, fd_data->fd_id, ret); | 309 | fd_data->pctype, fd_data->fd_id, ret); |
313 | err = true; | 310 | /* Free the packet buffer since it wasn't added to the ring */ |
311 | kfree(raw_packet); | ||
312 | return -EOPNOTSUPP; | ||
314 | } else if (I40E_DEBUG_FD & pf->hw.debug_mask) { | 313 | } else if (I40E_DEBUG_FD & pf->hw.debug_mask) { |
315 | if (add) | 314 | if (add) |
316 | dev_info(&pf->pdev->dev, "Filter OK for PCTYPE %d loc = %d)\n", | 315 | dev_info(&pf->pdev->dev, "Filter OK for PCTYPE %d loc = %d)\n", |
@@ -321,10 +320,7 @@ static int i40e_add_del_fdir_tcpv4(struct i40e_vsi *vsi, | |||
321 | fd_data->pctype, fd_data->fd_id); | 320 | fd_data->pctype, fd_data->fd_id); |
322 | } | 321 | } |
323 | 322 | ||
324 | if (err) | 323 | return 0; |
325 | kfree(raw_packet); | ||
326 | |||
327 | return err ? -EOPNOTSUPP : 0; | ||
328 | } | 324 | } |
329 | 325 | ||
330 | #define I40E_IP_DUMMY_PACKET_LEN 34 | 326 | #define I40E_IP_DUMMY_PACKET_LEN 34 |
@@ -343,7 +339,6 @@ static int i40e_add_del_fdir_ipv4(struct i40e_vsi *vsi, | |||
343 | { | 339 | { |
344 | struct i40e_pf *pf = vsi->back; | 340 | struct i40e_pf *pf = vsi->back; |
345 | struct iphdr *ip; | 341 | struct iphdr *ip; |
346 | bool err = false; | ||
347 | u8 *raw_packet; | 342 | u8 *raw_packet; |
348 | int ret; | 343 | int ret; |
349 | int i; | 344 | int i; |
@@ -365,12 +360,15 @@ static int i40e_add_del_fdir_ipv4(struct i40e_vsi *vsi, | |||
365 | 360 | ||
366 | fd_data->pctype = i; | 361 | fd_data->pctype = i; |
367 | ret = i40e_program_fdir_filter(fd_data, raw_packet, pf, add); | 362 | ret = i40e_program_fdir_filter(fd_data, raw_packet, pf, add); |
368 | |||
369 | if (ret) { | 363 | if (ret) { |
370 | dev_info(&pf->pdev->dev, | 364 | dev_info(&pf->pdev->dev, |
371 | "PCTYPE:%d, Filter command send failed for fd_id:%d (ret = %d)\n", | 365 | "PCTYPE:%d, Filter command send failed for fd_id:%d (ret = %d)\n", |
372 | fd_data->pctype, fd_data->fd_id, ret); | 366 | fd_data->pctype, fd_data->fd_id, ret); |
373 | err = true; | 367 | /* The packet buffer wasn't added to the ring so we |
368 | * need to free it now. | ||
369 | */ | ||
370 | kfree(raw_packet); | ||
371 | return -EOPNOTSUPP; | ||
374 | } else if (I40E_DEBUG_FD & pf->hw.debug_mask) { | 372 | } else if (I40E_DEBUG_FD & pf->hw.debug_mask) { |
375 | if (add) | 373 | if (add) |
376 | dev_info(&pf->pdev->dev, | 374 | dev_info(&pf->pdev->dev, |
@@ -383,10 +381,7 @@ static int i40e_add_del_fdir_ipv4(struct i40e_vsi *vsi, | |||
383 | } | 381 | } |
384 | } | 382 | } |
385 | 383 | ||
386 | if (err) | 384 | return 0; |
387 | kfree(raw_packet); | ||
388 | |||
389 | return err ? -EOPNOTSUPP : 0; | ||
390 | } | 385 | } |
391 | 386 | ||
392 | /** | 387 | /** |