After checking all possible call chains to fore200e_send here, my tool finds that fore200e_send is never called in atomic context. And this function is assigned to a function pointer "dev->ops->send", which is only called by vcc_sendmsg (net/atm/common.c) through vcc->dev->ops->send, and vcc_sendmsg calls schedule, it indicates that fore200e_send can call functions which may sleep. Thus GFP_ATOMIC is not necessary, and it can be replaced with GFP_KERNEL.
This is found by a static analysis tool named DCNS written by myself. Signed-off-by: Jia-Ju Bai <baijiaju1...@gmail.com> --- drivers/atm/fore200e.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c index 6ebc4e4..f6a5326 100644 --- a/drivers/atm/fore200e.c +++ b/drivers/atm/fore200e.c @@ -1611,7 +1611,7 @@ int bsq_audit(int where, struct host_bsq* bsq, int scheme, int magn) } if (tx_copy) { - data = kmalloc(tx_len, GFP_ATOMIC | GFP_DMA); + data = kmalloc(tx_len, GFP_KERNEL | GFP_DMA); if (data == NULL) { if (vcc->pop) { vcc->pop(vcc, skb); -- 1.7.9.5