From: "Bjørn Mork" <bjorn@mork.no>
To: David Laight <David.Laight@ACULAB.COM>
Cc: "'Jim Baxter'" <jim_baxter@mentor.com>,
"linux-usb\@vger.kernel.org" <linux-usb@vger.kernel.org>,
"netdev\@vger.kernel.org" <netdev@vger.kernel.org>,
"linux-kernel\@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Oliver Neukum <oliver@neukum.org>
Subject: Re: [RFC V1 1/1] net: cdc_ncm: Reduce memory use when kernel memory low
Date: Fri, 19 May 2017 15:55:55 +0200 [thread overview]
Message-ID: <87pof5rlw4.fsf@miraculix.mork.no> (raw)
In-Reply-To: <063D6719AE5E284EB5DD2968C1650D6DCFFFAA5C@AcuExch.aculab.com> (David Laight's message of "Fri, 19 May 2017 11:10:40 +0000")
David Laight <David.Laight@ACULAB.COM> writes:
> From: linux-usb-owner@vger.kernel.org [mailto:linux-usb-owner@vger.kernel.org] On Behalf Of Jim Baxter
>> Sent: 16 May 2017 18:41
>>
>> The CDC-NCM driver can require large amounts of memory to create
>> skb's and this can be a problem when the memory becomes fragmented.
>>
>> This especially affects embedded systems that have constrained
>> resources but wish to maximise the throughput of CDC-NCM with 16KiB
>> NTB's.
>
> Why is this driver copying multiple tx messages into a single skb.
Mostly becasue it already did that when I started messing with it, and I
didn't know how to avoid that.
> Surely there are better ways to do this??
But I have been there thinking this exact thought a couple of times.
Suggestions are appreciated.
> I think it is generating a 'multi-ethernet frame' URB with an
> overall header for each URB and a header for each ethernet frame.
With some negotiated alignment restrictions, and a linked list of frame
pointer arrays. But yes, that is basically it.
(it's not always ethernet - with MBIM it can be IP or arbitrary as well,
but I don't think that makes any difference)
> Given that the USB stack allows multiple concurrent transmits I'm
> surprised that batching large ethernet frames makes much difference.
Me too. Actually, I don't think it does. The protocol was developed
with specific device restrictions in mind. These might be invalid today.
There is no reason to believe that using simple CDC ECM framing
(i.e. one ethernet frame per URB) is any problem.
> Also the USB target can't actually tell when URB that contain
> multiples of the USB packet size end.
> So it is possible to send a single NTB as multiple URB.
Nice idea! Never thought of that. Yes, the driver could use a number
smaller buffers regardless of the NTB size, by abusing the fact that the
device will see them as a contigious USB transfer as long as they fall
on USB packet boundaries.
Started thinking about how to do this in practice. It seemed obviously
simply to jsut fire off the buffers as they fill up until the the max
aggregation size or time has been exceeded. But the header makes this
harder than necessary. It contains both a length and a pointer to the
first frame pointer array (NDP). So we will have to decide the size of
the NTB and where to put the first NDP before sending the first USB
packet. This is possible if we always go for the pad-to-max strategy.
We'll also have to make some assumptions about the size of the NDP(s) as
we add them, but we already do that so I don't think it is a big deal.
Might be the way to go.
Unless someone has a nice way to just collect a list of skbs and have
them converted to proper framing on the fly when transmitting, without
having to care about USB packet boundaries.
Bjørn
next prev parent reply other threads:[~2017-05-19 13:56 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-16 17:41 [RFC V1 0/1] Reduce cdc_ncm memory use when kernel memory low Jim Baxter
2017-05-16 17:41 ` [RFC V1 1/1] net: cdc_ncm: Reduce " Jim Baxter
2017-05-16 17:41 ` Jim Baxter
2017-05-16 18:24 ` Bjørn Mork
2017-05-17 7:44 ` Oliver Neukum
2017-05-17 7:44 ` Oliver Neukum
2017-05-17 10:56 ` Baxter, Jim
2017-05-17 18:18 ` David Miller
2017-05-18 10:01 ` Oliver Neukum
2017-05-22 15:45 ` Baxter, Jim
2017-05-22 15:54 ` David Miller
2017-05-23 8:42 ` Oliver Neukum
2017-05-23 15:26 ` David Miller
2017-05-23 19:06 ` Baxter, Jim
[not found] ` <1497263047.15677.13.camel@suse.com>
2017-06-12 12:32 ` Baxter, Jim
2017-05-19 11:10 ` David Laight
2017-05-19 13:55 ` Bjørn Mork [this message]
2017-05-19 14:46 ` David Laight
2017-05-22 13:27 ` Oliver Neukum
2017-05-22 13:27 ` Oliver Neukum
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=87pof5rlw4.fsf@miraculix.mork.no \
--to=bjorn@mork.no \
--cc=David.Laight@ACULAB.COM \
--cc=jim_baxter@mentor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=oliver@neukum.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 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.