netpoll: use GFP_ATOMIC in slave_enable_netpoll() and __netpoll_setup()
slave_enable_netpoll() and __netpoll_setup() may be called with read_lock() held, so should use GFP_ATOMIC to allocate memory. Eric suggested to pass gfp flags to __netpoll_setup(). Cc: Eric Dumazet <eric.dumazet@gmail.com> Cc: "David S. Miller" <davem@davemloft.net> Reported-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: Cong Wang <amwang@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
ddf343f635
commit
47be03a28c
@@ -715,7 +715,7 @@ int netpoll_parse_options(struct netpoll *np, char *opt)
|
||||
}
|
||||
EXPORT_SYMBOL(netpoll_parse_options);
|
||||
|
||||
int __netpoll_setup(struct netpoll *np, struct net_device *ndev)
|
||||
int __netpoll_setup(struct netpoll *np, struct net_device *ndev, gfp_t gfp)
|
||||
{
|
||||
struct netpoll_info *npinfo;
|
||||
const struct net_device_ops *ops;
|
||||
@@ -734,7 +734,7 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev)
|
||||
}
|
||||
|
||||
if (!ndev->npinfo) {
|
||||
npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL);
|
||||
npinfo = kmalloc(sizeof(*npinfo), gfp);
|
||||
if (!npinfo) {
|
||||
err = -ENOMEM;
|
||||
goto out;
|
||||
@@ -752,7 +752,7 @@ int __netpoll_setup(struct netpoll *np, struct net_device *ndev)
|
||||
|
||||
ops = np->dev->netdev_ops;
|
||||
if (ops->ndo_netpoll_setup) {
|
||||
err = ops->ndo_netpoll_setup(ndev, npinfo);
|
||||
err = ops->ndo_netpoll_setup(ndev, npinfo, gfp);
|
||||
if (err)
|
||||
goto free_npinfo;
|
||||
}
|
||||
@@ -857,7 +857,7 @@ int netpoll_setup(struct netpoll *np)
|
||||
refill_skbs();
|
||||
|
||||
rtnl_lock();
|
||||
err = __netpoll_setup(np, ndev);
|
||||
err = __netpoll_setup(np, ndev, GFP_KERNEL);
|
||||
rtnl_unlock();
|
||||
|
||||
if (err)
|
||||
|
||||
Reference in New Issue
Block a user