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: Michal 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
6b9107d6a1
Коммит
f72f116a2a
|
@ -73,7 +73,7 @@ static int _c4iw_write_mem_dma_aligned(struct c4iw_rdev *rdev, u32 addr,
|
|||
c4iw_init_wr_wait(&wr_wait);
|
||||
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)
|
||||
return -ENOMEM;
|
||||
set_wr_txq(skb, CPL_PRIORITY_CONTROL, 0);
|
||||
|
|
|
@ -1140,6 +1140,10 @@ static int set_filter_wr(struct adapter *adapter, int fidx)
|
|||
struct fw_filter_wr *fwr;
|
||||
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
|
||||
* rewriting then we need to allocate a Layer 2 Table (L2T) entry for
|
||||
* the filter.
|
||||
|
@ -1147,19 +1151,21 @@ static int set_filter_wr(struct adapter *adapter, int fidx)
|
|||
if (f->fs.newdmac || f->fs.newvlan) {
|
||||
/* allocate L2T entry for new filter */
|
||||
f->l2t = t4_l2t_alloc_switching(adapter->l2t);
|
||||
if (f->l2t == NULL)
|
||||
if (f->l2t == NULL) {
|
||||
kfree_skb(skb);
|
||||
return -EAGAIN;
|
||||
}
|
||||
if (t4_l2t_set_switching(adapter, f->l2t, f->fs.vlan,
|
||||
f->fs.eport, f->fs.dmac)) {
|
||||
cxgb4_l2t_release(f->l2t);
|
||||
f->l2t = NULL;
|
||||
kfree_skb(skb);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
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));
|
||||
memset(fwr, 0, sizeof(*fwr));
|
||||
|
||||
|
@ -1257,7 +1263,10 @@ static int del_filter_wr(struct adapter *adapter, int fidx)
|
|||
len = sizeof(*fwr);
|
||||
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);
|
||||
t4_mk_filtdelwr(ftid, fwr, adapter->sge.fw_evtq.abs_id);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче