IPoIB: Change CM skb memory allocation to be non-atomic during init
Change CM skb memory allocation to use GFP_KERNEL when possible. During device init there's no need to use GFP_ATOMIC when allocating memory for the CM skbs -- use GFP_KERNEL instead. Signed-off-by: Tal Alon <talal@mellanox.com> Signed-off-by: Erez Shitrit <erezsh@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
parent
c2bb5628db
commit
22252b4e09
1 changed files with 9 additions and 5 deletions
|
@ -140,7 +140,8 @@ static int ipoib_cm_post_receive_nonsrq(struct net_device *dev,
|
||||||
static struct sk_buff *ipoib_cm_alloc_rx_skb(struct net_device *dev,
|
static struct sk_buff *ipoib_cm_alloc_rx_skb(struct net_device *dev,
|
||||||
struct ipoib_cm_rx_buf *rx_ring,
|
struct ipoib_cm_rx_buf *rx_ring,
|
||||||
int id, int frags,
|
int id, int frags,
|
||||||
u64 mapping[IPOIB_CM_RX_SG])
|
u64 mapping[IPOIB_CM_RX_SG],
|
||||||
|
gfp_t gfp)
|
||||||
{
|
{
|
||||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
|
@ -164,7 +165,7 @@ static struct sk_buff *ipoib_cm_alloc_rx_skb(struct net_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < frags; i++) {
|
for (i = 0; i < frags; i++) {
|
||||||
struct page *page = alloc_page(GFP_ATOMIC);
|
struct page *page = alloc_page(gfp);
|
||||||
|
|
||||||
if (!page)
|
if (!page)
|
||||||
goto partial_error;
|
goto partial_error;
|
||||||
|
@ -382,7 +383,8 @@ static int ipoib_cm_nonsrq_init_rx(struct net_device *dev, struct ib_cm_id *cm_i
|
||||||
|
|
||||||
for (i = 0; i < ipoib_recvq_size; ++i) {
|
for (i = 0; i < ipoib_recvq_size; ++i) {
|
||||||
if (!ipoib_cm_alloc_rx_skb(dev, rx->rx_ring, i, IPOIB_CM_RX_SG - 1,
|
if (!ipoib_cm_alloc_rx_skb(dev, rx->rx_ring, i, IPOIB_CM_RX_SG - 1,
|
||||||
rx->rx_ring[i].mapping)) {
|
rx->rx_ring[i].mapping,
|
||||||
|
GFP_KERNEL)) {
|
||||||
ipoib_warn(priv, "failed to allocate receive buffer %d\n", i);
|
ipoib_warn(priv, "failed to allocate receive buffer %d\n", i);
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_count;
|
goto err_count;
|
||||||
|
@ -639,7 +641,8 @@ void ipoib_cm_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
|
||||||
frags = PAGE_ALIGN(wc->byte_len - min(wc->byte_len,
|
frags = PAGE_ALIGN(wc->byte_len - min(wc->byte_len,
|
||||||
(unsigned)IPOIB_CM_HEAD_SIZE)) / PAGE_SIZE;
|
(unsigned)IPOIB_CM_HEAD_SIZE)) / PAGE_SIZE;
|
||||||
|
|
||||||
newskb = ipoib_cm_alloc_rx_skb(dev, rx_ring, wr_id, frags, mapping);
|
newskb = ipoib_cm_alloc_rx_skb(dev, rx_ring, wr_id, frags,
|
||||||
|
mapping, GFP_ATOMIC);
|
||||||
if (unlikely(!newskb)) {
|
if (unlikely(!newskb)) {
|
||||||
/*
|
/*
|
||||||
* If we can't allocate a new RX buffer, dump
|
* If we can't allocate a new RX buffer, dump
|
||||||
|
@ -1556,7 +1559,8 @@ int ipoib_cm_dev_init(struct net_device *dev)
|
||||||
for (i = 0; i < ipoib_recvq_size; ++i) {
|
for (i = 0; i < ipoib_recvq_size; ++i) {
|
||||||
if (!ipoib_cm_alloc_rx_skb(dev, priv->cm.srq_ring, i,
|
if (!ipoib_cm_alloc_rx_skb(dev, priv->cm.srq_ring, i,
|
||||||
priv->cm.num_frags - 1,
|
priv->cm.num_frags - 1,
|
||||||
priv->cm.srq_ring[i].mapping)) {
|
priv->cm.srq_ring[i].mapping,
|
||||||
|
GFP_KERNEL)) {
|
||||||
ipoib_warn(priv, "failed to allocate "
|
ipoib_warn(priv, "failed to allocate "
|
||||||
"receive buffer %d\n", i);
|
"receive buffer %d\n", i);
|
||||||
ipoib_cm_dev_cleanup(dev);
|
ipoib_cm_dev_cleanup(dev);
|
||||||
|
|
Loading…
Add table
Reference in a new issue