From: wwguy <wey-yi.w.guy@intel.com>
To: "Nathaniel J. Smith" <njs@pobox.com>
Cc: "linville@tuxdriver.com" <linville@tuxdriver.com>,
"linux-wireless@vger.kernel.org" <linux-wireless@vger.kernel.org>,
"ilw@linux.intel.com" <ilw@linux.intel.com>
Subject: Re: [PATCH 4/5] iwlwifi: auto-tune tx queue size to minimize latency
Date: Mon, 14 Feb 2011 07:46:18 -0800 [thread overview]
Message-ID: <1297698378.4723.14.camel@wwguy-ubuntu> (raw)
In-Reply-To: <1297619803-2832-5-git-send-email-njs@pobox.com>
Hi Nathaniel,
On Sun, 2011-02-13 at 09:56 -0800, Nathaniel J. Smith wrote:
> We maintain several ring buffers that queue up packets for the
> hardware to transmit. These buffers can be quite large, and the
> quality of wireless connections can vary greatly; as a result, it can
> be that a full queue might take multiple seconds to drain.
>
> For instance, if there is a high-bandwidth outgoing flow, like a large
> file upload, then it will completely fill the tx queues. Once the
> queues are full, then any other outgoing packets -- like those sent
> when a user clicks on an HTTP link, or types into an SSH session --
> will have to wait at the end of the line, and will not actually be
> transmitted until multiple seconds have passed. This results in a
> suboptimal level of interactive response.
>
> So we really don't want to allow too many packets to get queued up. On
> the other hand, we do want to queue up *some* packets, to maintain
> throughput -- and the queue size that maintains interactivity for a
> degraded 1 Mb/s connection might not be so great for some
> super-fancy 802.11n 600 Mb/s connection.
>
> This patch estimates how long it takes the hardware to transmit one
> packet (by comparing each packet's queue residency time to the number
> of packets it had to wait behind), and then further smooths these
> estimates with an EWMA. Then, it uses the estimated packet
> transmission time to choose the maximum queue size that will still
> produce reasonably bounded queue residency times, given current
> conditions.
>
> Signed-off-by: Nathaniel J. Smith <njs@pobox.com>
> ---
> drivers/net/wireless/iwlwifi/iwl-3945.c | 1 +
> drivers/net/wireless/iwlwifi/iwl-agn-tx.c | 3 +++
> drivers/net/wireless/iwlwifi/iwl-core.h | 1 +
> drivers/net/wireless/iwlwifi/iwl-dev.h | 11 +++++++++++
> drivers/net/wireless/iwlwifi/iwl-tx.c | 26 ++++++++++++++++++++++++++
> drivers/net/wireless/iwlwifi/iwl3945-base.c | 2 ++
> 6 files changed, 44 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
> index f2e9e59..d52bcb3 100644
>
> +void iwl_tx_queue_update_high_mark(struct iwl_tx_queue *txq, int index)
> +{
> + struct iwl_queue *q = &txq->q;
> + struct timespec now, diff;
> + int enqueue_depth = txq->txb[index].enqueue_depth;
> + int this_ns_per_packet, avg_ns_per_packet;
> + int new_high_mark;
> +
> + getrawmonotonic(&now);
> + diff = timespec_sub(now, txq->txb[index].enqueue_time);
> + this_ns_per_packet = (NSEC_PER_SEC / enqueue_depth) * diff.tv_sec;
> + this_ns_per_packet += diff.tv_nsec / enqueue_depth;
> + /* Just some sanity checks for paranoia's sake */
> + if (this_ns_per_packet < 0 && this_ns_per_packet > NSEC_PER_SEC)
> + return;
> + ewma_add(&q->ns_per_packet, this_ns_per_packet);
> + avg_ns_per_packet = ewma_read(&q->ns_per_packet);
> + new_high_mark = IWL_TX_HIGH_MARK_IN_NSEC / avg_ns_per_packet;
> + new_high_mark = clamp(new_high_mark, 2, q->n_window - 2);
> + atomic_set(&q->high_mark, new_high_mark);
> +}
> +EXPORT_SYMBOL(iwl_tx_queue_update_high_mark);
> +
> +
should the high_mark get reset when interface up or queue reset.
Wey
next prev parent reply other threads:[~2011-02-14 15:48 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-13 17:56 [PATCH 0/5] iwlwifi: Auto-tune tx queue size to maintain latency under load Nathaniel J. Smith
2011-02-13 17:56 ` [PATCH 1/5] iwlwifi: Simplify tx queue management Nathaniel J. Smith
2011-02-14 9:57 ` Johannes Berg
2011-02-14 22:17 ` Nathaniel Smith
2011-02-14 22:45 ` wwguy
2011-02-15 0:15 ` Dave Täht
2011-02-16 9:16 ` Stanislaw Gruszka
2011-02-16 14:41 ` John W. Linville
2011-02-16 15:13 ` wwguy
2011-02-15 12:11 ` Johannes Berg
2011-02-14 15:33 ` wwguy
2011-02-13 17:56 ` [PATCH 2/5] iwlwifi: Convert the tx queue high_mark to an atomic_t Nathaniel J. Smith
2011-02-14 12:16 ` Johannes Berg
2011-02-14 22:35 ` Nathaniel Smith
2011-02-15 12:08 ` Johannes Berg
2011-02-15 17:37 ` Nathaniel Smith
2011-02-13 17:56 ` [PATCH 3/5] iwlwifi: Invert the sense of the queue high_mark Nathaniel J. Smith
2011-02-13 17:56 ` [PATCH 4/5] iwlwifi: auto-tune tx queue size to minimize latency Nathaniel J. Smith
2011-02-14 12:17 ` Johannes Berg
2011-02-14 21:58 ` Nathaniel Smith
2011-02-15 12:13 ` Johannes Berg
2011-02-15 15:03 ` John W. Linville
2011-02-16 8:59 ` Johannes Berg
2011-02-15 17:31 ` Nathaniel Smith
2011-02-14 15:46 ` wwguy [this message]
2011-02-13 17:56 ` [PATCH 5/5] iwlwifi: make current tx queue sizes visible in debugfs Nathaniel J. Smith
2011-02-14 0:32 ` [PATCH 0/5] iwlwifi: Auto-tune tx queue size to maintain latency under load Julian Calaby
2011-02-14 3:28 ` Nathaniel Smith
2011-02-16 15:50 ` John W. Linville
2011-02-16 23:08 ` Nathaniel Smith
2011-02-16 23:42 ` wwguy
2011-02-17 1:49 ` [RFC] mac80211: implement eBDP algorithm to fight bufferbloat John W. Linville
2011-02-17 3:31 ` Ben Greear
2011-02-17 4:26 ` Nathaniel Smith
2011-02-17 8:31 ` Johannes Berg
2011-02-18 21:21 ` [RFC v2] " John W. Linville
2011-02-19 3:44 ` Nathaniel Smith
2011-02-21 18:47 ` John W. Linville
2011-02-21 23:26 ` Nathaniel Smith
2011-02-23 22:28 ` John W. Linville
2011-02-25 18:21 ` Nathaniel Smith
2011-02-25 18:27 ` Nathaniel Smith
2011-02-20 0:37 ` Nathaniel Smith
2011-02-21 18:52 ` John W. Linville
2011-02-21 15:28 ` Johannes Berg
2011-02-21 19:06 ` John W. Linville
2011-02-21 20:26 ` Tianji Li
2011-02-28 13:07 ` Johannes Berg
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=1297698378.4723.14.camel@wwguy-ubuntu \
--to=wey-yi.w.guy@intel.com \
--cc=ilw@linux.intel.com \
--cc=linux-wireless@vger.kernel.org \
--cc=linville@tuxdriver.com \
--cc=njs@pobox.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.