Skip to content

Commit

Permalink
netpoll: netpoll_send_skb() returns transmit status
Browse files Browse the repository at this point in the history
Some callers want to know if the packet has been sent or
dropped, to inform upper stacks.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed May 8, 2020
1 parent fb1eee4 commit 1ddabdf
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 5 deletions.
2 changes: 1 addition & 1 deletion include/linux/netpoll.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ int netpoll_setup(struct netpoll *np);
void __netpoll_cleanup(struct netpoll *np);
void __netpoll_free(struct netpoll *np);
void netpoll_cleanup(struct netpoll *np);
void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb);
netdev_tx_t netpoll_send_skb(struct netpoll *np, struct sk_buff *skb);

#ifdef CONFIG_NETPOLL
static inline void *netpoll_poll_lock(struct napi_struct *napi)
Expand Down
11 changes: 7 additions & 4 deletions net/core/netpoll.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ static int netpoll_owner_active(struct net_device *dev)
}

/* call with IRQ disabled */
static void __netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
static netdev_tx_t __netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
{
netdev_tx_t status = NETDEV_TX_BUSY;
struct net_device *dev;
Expand All @@ -320,7 +320,7 @@ static void __netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)

if (!npinfo || !netif_running(dev) || !netif_device_present(dev)) {
dev_kfree_skb_irq(skb);
return;
return NET_XMIT_DROP;
}

/* don't get messages out of order, and no recursion */
Expand Down Expand Up @@ -359,15 +359,18 @@ static void __netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
skb_queue_tail(&npinfo->txq, skb);
schedule_delayed_work(&npinfo->tx_work,0);
}
return NETDEV_TX_OK;
}

void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
netdev_tx_t netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
{
unsigned long flags;
netdev_tx_t ret;

local_irq_save(flags);
__netpoll_send_skb(np, skb);
ret = __netpoll_send_skb(np, skb);
local_irq_restore(flags);
return ret;
}
EXPORT_SYMBOL(netpoll_send_skb);

Expand Down

0 comments on commit 1ddabdf

Please sign in to comment.