aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Keller <jacob.e.keller@intel.com>2017-02-06 17:38:41 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2017-03-20 19:45:20 -0400
commite5187ee3ee9a95b1aa32a9a3daf4f07a9f89c20c (patch)
tree6607861cacb221079be19002d472235f2a0c43ef
parent01016da1e58136518252822738fe833c662df916 (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.c33
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/**