Commit f72f116a authored by Michal Hocko's avatar Michal Hocko Committed by David S. Miller

cxgb4: drop __GFP_NOFAIL allocation

set_filter_wr is requesting __GFP_NOFAIL allocation although it can return
ENOMEM without any problems obviously (t4_l2t_set_switching does that
already).  So the non-failing requirement is too strong without any
obvious reason.  Drop __GFP_NOFAIL and reorganize the code to have the
failure paths easier.

The same applies to _c4iw_write_mem_dma_aligned which uses __GFP_NOFAIL
and then checks the return value and returns -ENOMEM on failure.  This
doesn't make any sense what so ever.  Either the allocation cannot fail or
it can.

del_filter_wr seems to be safe as well because the filter entry is not
marked as pending and the return value is propagated up the stack up to
c4iw_destroy_listen.
Signed-off-by: default avatarMichal Hocko <mhocko@suse.cz>
Cc: David Rientjes <rientjes@google.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Dave Chinner <david@fromorbit.com>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Hariprasad S <hariprasad@chelsio.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6b9107d6
...@@ -73,7 +73,7 @@ static int _c4iw_write_mem_dma_aligned(struct c4iw_rdev *rdev, u32 addr, ...@@ -73,7 +73,7 @@ static int _c4iw_write_mem_dma_aligned(struct c4iw_rdev *rdev, u32 addr,
c4iw_init_wr_wait(&wr_wait); c4iw_init_wr_wait(&wr_wait);
wr_len = roundup(sizeof(*req) + sizeof(*sgl), 16); wr_len = roundup(sizeof(*req) + sizeof(*sgl), 16);
skb = alloc_skb(wr_len, GFP_KERNEL | __GFP_NOFAIL); skb = alloc_skb(wr_len, GFP_KERNEL);
if (!skb) if (!skb)
return -ENOMEM; return -ENOMEM;
set_wr_txq(skb, CPL_PRIORITY_CONTROL, 0); set_wr_txq(skb, CPL_PRIORITY_CONTROL, 0);
......
...@@ -1140,6 +1140,10 @@ static int set_filter_wr(struct adapter *adapter, int fidx) ...@@ -1140,6 +1140,10 @@ static int set_filter_wr(struct adapter *adapter, int fidx)
struct fw_filter_wr *fwr; struct fw_filter_wr *fwr;
unsigned int ftid; unsigned int ftid;
skb = alloc_skb(sizeof(*fwr), GFP_KERNEL);
if (!skb)
return -ENOMEM;
/* If the new filter requires loopback Destination MAC and/or VLAN /* If the new filter requires loopback Destination MAC and/or VLAN
* rewriting then we need to allocate a Layer 2 Table (L2T) entry for * rewriting then we need to allocate a Layer 2 Table (L2T) entry for
* the filter. * the filter.
...@@ -1147,19 +1151,21 @@ static int set_filter_wr(struct adapter *adapter, int fidx) ...@@ -1147,19 +1151,21 @@ static int set_filter_wr(struct adapter *adapter, int fidx)
if (f->fs.newdmac || f->fs.newvlan) { if (f->fs.newdmac || f->fs.newvlan) {
/* allocate L2T entry for new filter */ /* allocate L2T entry for new filter */
f->l2t = t4_l2t_alloc_switching(adapter->l2t); f->l2t = t4_l2t_alloc_switching(adapter->l2t);
if (f->l2t == NULL) if (f->l2t == NULL) {
kfree_skb(skb);
return -EAGAIN; return -EAGAIN;
}
if (t4_l2t_set_switching(adapter, f->l2t, f->fs.vlan, if (t4_l2t_set_switching(adapter, f->l2t, f->fs.vlan,
f->fs.eport, f->fs.dmac)) { f->fs.eport, f->fs.dmac)) {
cxgb4_l2t_release(f->l2t); cxgb4_l2t_release(f->l2t);
f->l2t = NULL; f->l2t = NULL;
kfree_skb(skb);
return -ENOMEM; return -ENOMEM;
} }
} }
ftid = adapter->tids.ftid_base + fidx; ftid = adapter->tids.ftid_base + fidx;
skb = alloc_skb(sizeof(*fwr), GFP_KERNEL | __GFP_NOFAIL);
fwr = (struct fw_filter_wr *)__skb_put(skb, sizeof(*fwr)); fwr = (struct fw_filter_wr *)__skb_put(skb, sizeof(*fwr));
memset(fwr, 0, sizeof(*fwr)); memset(fwr, 0, sizeof(*fwr));
...@@ -1257,7 +1263,10 @@ static int del_filter_wr(struct adapter *adapter, int fidx) ...@@ -1257,7 +1263,10 @@ static int del_filter_wr(struct adapter *adapter, int fidx)
len = sizeof(*fwr); len = sizeof(*fwr);
ftid = adapter->tids.ftid_base + fidx; ftid = adapter->tids.ftid_base + fidx;
skb = alloc_skb(len, GFP_KERNEL | __GFP_NOFAIL); skb = alloc_skb(len, GFP_KERNEL);
if (!skb)
return -ENOMEM;
fwr = (struct fw_filter_wr *)__skb_put(skb, len); fwr = (struct fw_filter_wr *)__skb_put(skb, len);
t4_mk_filtdelwr(ftid, fwr, adapter->sge.fw_evtq.abs_id); t4_mk_filtdelwr(ftid, fwr, adapter->sge.fw_evtq.abs_id);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment