Alex Villací­s Lasso | 10 Nov 17:09 2008
Picon

[1/3] IRDA: Create new field tx_extra in skbuff

For background, see regression report at 
http://bugzilla.kernel.org/show_bug.cgi?id=11795

This patchset attempts to fix a regression that broke the irda stack as 
a result of the qdisc patches merged in 2.6.27.

The previous patchsets attempt to fix the clobbering of the irda 
information by storing it within the data payload itself, as an 
additional header. For this, space has been allocated via skb_pull (?!) 
and later, skb_reserve(). The problem with this approach is that  we do 
not have a guarantee that all skbuffs that are processed in the irda 
stack are actually allocated with functions that reserve the required 
space for the irda metadata, especially in the tx route. In addition, 
this approach mixes the payload data with metadata that should not be 
transmitted at all, which is a bit disorganized.

This is the first of 3 patches that try a different approach. Instead of 
allocating an additional "header" within the data buffer itself, it 
introduces a new field within the skbuff, named tx_extra. This field 
should be used for passing data from the higher layers that is required 
for the drivers to transmit the packet correctly, and formalizes the 
previous usage of the cb field by the irda stack. The only issue I see 
is that every single skbuff carries an additional 32 bytes which are not 
put to any use in other stacks (for now). I was thinking about a pointer 
field to on-the-fly allocated data, but that means messing around with 
the skbuff allocation functions, the cloning functions (involving 
deciding how to behave on cloning), etc. This way is simpler to understand.

This patch and the other two that follow fix the issue for me under 
2.6.28-rc3. Please comment on this, as I am messing around with the 
(Continue reading)

Alex Villací­s Lasso | 10 Nov 17:11 2008
Picon

[2/3] IRDA stack should call irda_get_skb_cb (tx_extra implementation)

A rewrite of the original patch by Samuel Ortiz, for the tx_extra 
implementation. Does away with irda_alloc_skb which is irrelevant for 
this implementation.

Based on a patch by Samuel Ortiz <samuel <at> sortiz.org>

Signed-off-by: Alex Villacís Lasso <a_villacis <at> palosanto.com>

--

-- 
perl -e '$x=2.4;print sprintf("%.0f + %.0f = %.0f\n",$x,$x,$x+$x);'

Alex Villací­s Lasso | 10 Nov 17:13 2008
Picon

[3/3] IRDA drivers should call irda_get_skb_cb

The original patch by Samuel Ortiz, which applies without changes for 
the tx_extra implementation.

Tested-by: Alex Villacís Lasso <a_villacis <at> palosanto.com>

--

-- 
perl -e '$x=2.4;print sprintf("%.0f + %.0f = %.0f\n",$x,$x,$x+$x);'

Evgeniy Polyakov | 10 Nov 17:35 2008
Picon

Re: [1/3] IRDA: Create new field tx_extra in skbuff

Hi Alex.

On Mon, Nov 10, 2008 at 11:09:33AM -0500, Alex Villací­s Lasso (avillaci <at> ceibo.fiec.espol.edu.ec) wrote:
> The previous patchsets attempt to fix the clobbering of the irda 
> information by storing it within the data payload itself, as an 
> additional header. For this, space has been allocated via skb_pull (?!) 
> and later, skb_reserve(). The problem with this approach is that  we do 
> not have a guarantee that all skbuffs that are processed in the irda 
> stack are actually allocated with functions that reserve the required 
> space for the irda metadata, especially in the tx route. In addition, 
> this approach mixes the payload data with metadata that should not be 
> transmitted at all, which is a bit disorganized.

Do all irda transfers require that additional data?
You can simply change MAX_HEADER macro to be bigger than that size
if it has to be larger than existing the biggest ax25 layer, which I
doubt it has to.

This data is always allocated for all transmitted skbs. Reserve is also
properly done in sending functions.

> This is the first of 3 patches that try a different approach. Instead of 
> allocating an additional "header" within the data buffer itself, it 
> introduces a new field within the skbuff, named tx_extra. This field 
> should be used for passing data from the higher layers that is required 
> for the drivers to transmit the packet correctly, and formalizes the 
> previous usage of the cb field by the irda stack. The only issue I see 
> is that every single skbuff carries an additional 32 bytes which are not 

I really wanted to write a joke about existing practice of shrinking skb
(Continue reading)

Samuel Ortiz | 10 Nov 17:47 2008

Re: [irda-users] [1/3] IRDA: Create new field tx_extra in skbuff

Hi Alex,

On Mon, Nov 10, 2008 at 11:09:33AM -0500, Alex Villací­s Lasso wrote:
> This patch and the other two that follow fix the issue for me under  
> 2.6.28-rc3. Please comment on this, as I am messing around with the  
> skbuff structure, which potentially affects all network stacks.
Adding 32 bytes to _all_ skbs is a no-no.
This is an IrDA specific issue, and it has to be fixed in an IrDA specific
way. My patches work with my irda-usb and mcs7780 dongles. If they dont for
you, then we should dump the kernel stack when we're hitting the problem of
not having reserved enough headroom for the irda cb.
Evgeniy's proposal could also be another solution.

Cheers,
Samuel.

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo <at> vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Evgeniy Polyakov | 10 Nov 17:55 2008
Picon

Re: [1/3] IRDA: Create new field tx_extra in skbuff

On Mon, Nov 10, 2008 at 07:35:46PM +0300, Evgeniy Polyakov (zbr <at> ioremap.net) wrote:
> What exactly should be carried in that area?

It is struct irda_skb_cb, which contains qos and other bits of
intormation about how to transfer data, which are in turn obtained from
various _cb IRDA structures, which I tracked upto to for example
lsap_cb, which exists in the hash table. Do others also accessible via
similar mechanism? Can that data be stored on per-device basis like
ethernet checksum/offloading parameters (for example like LRO is done)?

--

-- 
	Evgeniy Polyakov
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo <at> vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

David Miller | 10 Nov 21:51 2008
Picon

Re: [1/3] IRDA: Create new field tx_extra in skbuff

From: Alex Villací­s Lasso <avillaci <at> ceibo.fiec.espol.edu.ec>
Date: Mon, 10 Nov 2008 11:09:33 -0500

>  <at>  <at>  -279,6 +279,14  <at>  <at> 
>  	 */
>  	char			cb[48];
>  
> +	/*
> +	 * Additional space for layer-specific variables that need to
> +	 * survive past dev_queue_xmit(), which clobbers cb above.
> +	 * Intended for use by drivers that need additional layer-specific
> +	 * parameters in order to transmit a packet properly.
> +	 */
> +	char			tx_extra[32];
> +

This kind of bloat is absolutely not acceptable.

With IRDA as the only user of this thing, %99.99999 of systems out
there will just have this wasted space doing absolutely nothing.
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo <at> vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Samuel Ortiz | 11 Nov 02:00 2008

Re: [1/3] IRDA: Create new field tx_extra in skbuff

On Mon, Nov 10, 2008 at 07:55:44PM +0300, Evgeniy Polyakov wrote:
> On Mon, Nov 10, 2008 at 07:35:46PM +0300, Evgeniy Polyakov
(zbr@...) wrote:
> > What exactly should be carried in that area?
> 
> It is struct irda_skb_cb, which contains qos and other bits of
> intormation about how to transfer data, which are in turn obtained from
> various _cb IRDA structures, which I tracked upto to for example
> lsap_cb, which exists in the hash table. Do others also accessible via
> similar mechanism? Can that data be stored on per-device basis like
> ethernet checksum/offloading parameters (for example like LRO is done)?
I thought about that solution, but the irda_skb_cb line field has to be kept
per skb. It is needed for ircomm LMP flow control, in the skb destructor. I
see that BT rfcomm does something similar, but uses the skbuff->sk as a
rfcomm_dev pointer. As far as I understand the skbuff structure, that doesnt
look like a reasonnable solution, as we cant assume the sk pointer won't be
altered down the line.

Cheers,
Samuel.

-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
Evgeniy Polyakov | 11 Nov 07:22 2008
Picon

Re: [irda-users] [1/3] IRDA: Create new field tx_extra in skbuff

Hi Samuel.

On Tue, Nov 11, 2008 at 02:00:01AM +0100, Samuel Ortiz (samuel <at> sortiz.org) wrote:
> I thought about that solution, but the irda_skb_cb line field has to be kept
> per skb. It is needed for ircomm LMP flow control, in the skb destructor. I
> see that BT rfcomm does something similar, but uses the skbuff->sk as a
> rfcomm_dev pointer. As far as I understand the skbuff structure, that doesnt
> look like a reasonnable solution, as we cant assume the sk pointer won't be
> altered down the line.

It depends... If you own skb (when reference counter is 1), you can
owerwrite socket pointer with own data as long as destructor will also
be updated. You can try to clone skb and free old one to achieve this,
but it is not the fastest operation, althouhg I think both bt and irda
can afford that. Obviously in the first case you have to call old
destructor with old socket pointer also.

--

-- 
	Evgeniy Polyakov
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo <at> vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Alex Villací­s Lasso | 11 Nov 17:15 2008
Picon

Re: [1/3] IRDA: Create new field tx_extra in skbuff

I removed my trial patches from rc3 and applied Samuel's again, plus a 
WARN_ON on the condition of insufficient header space. Then I rebooted 
and tested my ks959-sir dongle with a Sony Ericsson phone and obexftp -i 
-l. As expected, it failed to connect (even though discovery works OK), 
and I captured the attached dmesg output. Just in case it helps, my 
kernel configuration is attached too.

-- 
perl -e '$x=2.4;print sprintf("%.0f + %.0f = %.0f\n",$x,$x,$x+$x);'

#
# Automatically generated make config: don't edit
# Linux kernel version: 2.6.28-rc3
# Fri Nov  7 22:19:47 2008
#
# CONFIG_64BIT is not set
CONFIG_X86_32=y
# CONFIG_X86_64 is not set
CONFIG_X86=y
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/i386_defconfig"
CONFIG_GENERIC_TIME=y
CONFIG_GENERIC_CMOS_UPDATE=y
CONFIG_CLOCKSOURCE_WATCHDOG=y
CONFIG_GENERIC_CLOCKEVENTS=y
CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
(Continue reading)


Gmane