From: Stephen Hemminger <shemminger@osdl.org>
To: David Miller <davem@davemloft.net>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 3/5] netpoll: cleanup transmit retry logic
Date: Mon, 23 Oct 2006 12:03:11 -0700 [thread overview]
Message-ID: <20061023120311.0f23fcee@dxpl.pdx.osdl.net> (raw)
In-Reply-To: <20061023115337.1f636ffb@dxpl.pdx.osdl.net>
Change netpoll transmit logic so:
* retries are per attempt not global. don't want to start drop
packets just because of temporary blockage.
* acquire xmit_lock correctly
* if device is not available just drop
* always queue if send fails, don't drop
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
--- netpoll.orig/include/linux/netpoll.h
+++ netpoll/include/linux/netpoll.h
@@ -27,7 +27,6 @@ struct netpoll {
struct netpoll_info {
spinlock_t poll_lock;
int poll_owner;
- int tries;
int rx_flags;
spinlock_t rx_lock;
struct netpoll *rx_np; /* netpoll that registered an rx_hook */
--- netpoll.orig/net/core/netpoll.c
+++ netpoll/net/core/netpoll.c
@@ -250,50 +250,42 @@ static struct sk_buff * find_skb(struct
static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
{
- int status;
- struct netpoll_info *npinfo;
-
- if (!np || !np->dev || !netif_running(np->dev))
- goto free_skb;
+ struct net_device *dev = np->dev;
+ int tries = MAX_RETRIES;
- npinfo = np->dev->npinfo;
+ do {
+ int status;
- /* avoid recursion */
- if (npinfo->poll_owner == smp_processor_id() ||
- np->dev->xmit_lock_owner == smp_processor_id()) {
- if (np->drop)
- np->drop(skb);
- else
+ /* if device is offline, give up */
+ if (!netif_running(dev) || !netif_device_present(dev)) {
__kfree_skb(skb);
- return;
- }
+ return;
+ }
- do {
- npinfo->tries--;
- netif_tx_lock(np->dev);
+ /* grap tx lock, but avoid recursion problems */
+ if (!netif_tx_trylock(dev))
+ break;
+
+ /* drivers do not expect to be called if queue is stopped. */
+ if (netif_queue_stopped(dev))
+ status = NETDEV_TX_BUSY;
+ else
+ status = dev->hard_start_xmit(skb, dev);
+ netif_tx_unlock(dev);
- /*
- * network drivers do not expect to be called if the queue is
- * stopped.
- */
- status = NETDEV_TX_BUSY;
- if (!netif_queue_stopped(np->dev))
- status = np->dev->hard_start_xmit(skb, np->dev);
-
- netif_tx_unlock(np->dev);
-
- /* success */
- if(!status) {
- npinfo->tries = MAX_RETRIES; /* reset */
+ /* succesfull send */
+ if (status == NETDEV_TX_OK)
return;
- }
- /* transmit busy */
+ /* transmit busy, maybe cleaning up will help */
netpoll_poll(np);
udelay(50);
- } while (npinfo->tries > 0);
-free_skb:
- __kfree_skb(skb);
+ } while (--tries > 0);
+
+ if (np->drop)
+ np->drop(skb);
+ else
+ __kfree_skb(skb);
}
void netpoll_send_udp(struct netpoll *np, const char *msg, int len)
@@ -646,7 +638,7 @@ int netpoll_setup(struct netpoll *np)
npinfo->rx_np = NULL;
spin_lock_init(&npinfo->poll_lock);
npinfo->poll_owner = -1;
- npinfo->tries = MAX_RETRIES;
+
spin_lock_init(&npinfo->rx_lock);
skb_queue_head_init(&npinfo->arp_tx);
} else
next prev parent reply other threads:[~2006-10-23 19:06 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-10-19 17:15 [PATCH 0/3] netpoll/netconsole fixes Stephen Hemminger
2006-10-19 17:15 ` [PATCH 1/3] netpoll: initialize skb for UDP Stephen Hemminger
2006-10-20 6:58 ` David Miller
2006-10-19 17:15 ` [PATCH 2/3] netpoll: rework skb transmit queue Stephen Hemminger
2006-10-20 7:15 ` David Miller
2006-10-20 15:18 ` Stephen Hemminger
2006-10-20 19:24 ` David Miller
2006-10-20 19:25 ` Stephen Hemminger
2006-10-20 19:52 ` David Miller
2006-10-20 20:14 ` Stephen Hemminger
2006-10-20 20:25 ` Stephen Hemminger
2006-10-21 5:00 ` Dave Jones
2006-10-21 6:38 ` David Miller
2006-10-20 15:40 ` Stephen Hemminger
2006-10-20 19:27 ` David Miller
2006-10-20 19:31 ` Stephen Hemminger
2006-10-20 20:42 ` David Miller
2006-10-20 20:48 ` Stephen Hemminger
2006-10-20 21:01 ` Andi Kleen
2006-10-20 21:08 ` David Miller
2006-10-20 21:16 ` Andi Kleen
2006-10-20 21:41 ` Stephen Hemminger
2006-10-20 21:01 ` David Miller
2006-10-20 22:30 ` [PATCH 1/3] netpoll: use sk_buff_head for txq Stephen Hemminger
2006-10-23 3:42 ` David Miller
2006-10-23 19:02 ` [PATCH 1/5] " Stephen Hemminger
2006-10-23 19:04 ` [PATCH 5/5] netpoll: interface cleanup Stephen Hemminger
2006-10-24 6:03 ` [PATCH 1/5] netpoll: use sk_buff_head for txq David Miller
2006-10-24 14:51 ` Stephen Hemminger
2006-10-24 14:14 ` Stephen Hemminger
[not found] ` <20061023115111.0d69846e@dxpl.pdx.osdl.net>
2006-10-23 19:02 ` [PATCH 2/5] netpoll: cleanup queued transmit Stephen Hemminger
[not found] ` <20061023115337.1f636ffb@dxpl.pdx.osdl.net>
2006-10-23 19:02 ` [PATCH 4/5] netpoll: move drop hook inline Stephen Hemminger
2006-10-23 19:03 ` Stephen Hemminger [this message]
2006-10-20 22:32 ` [PATCH 2/3] netpoll: use device xmit directly Stephen Hemminger
2006-10-20 22:35 ` [PATCH 3/3] netpoll: retry logic cleanup Stephen Hemminger
2006-10-19 17:15 ` [PATCH 3/3] netpoll: use skb_buff_head for skb cache Stephen Hemminger
2006-10-20 6:57 ` [PATCH 0/3] netpoll/netconsole fixes Andrew Morton
2006-10-20 7:16 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20061023120311.0f23fcee@dxpl.pdx.osdl.net \
--to=shemminger@osdl.org \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).