2005-10-13 21:44:04

by Michael Buesch

[permalink] [raw]
Subject: [PATCH ieee80211] fix TX skb allocation flags and size

ieee80211 subsystem:
* Use GFP mask on TX skb allocation.
* Allocate TX skb memory DMA mappable.
* Use the tx_headroom and reserve requested space.

--- linux-2.6.14-rc4-git2/net/ieee80211/ieee80211_tx.c.orig 2005-10-13 22:45:13.000000000 +0200
+++ linux-2.6.14-rc4-git2/net/ieee80211/ieee80211_tx.c 2005-10-13 22:56:43.000000000 +0200
@@ -207,7 +207,7 @@ void ieee80211_txb_free(struct ieee80211
}

static struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size,
- gfp_t gfp_mask)
+ int headroom, gfp_t gfp_mask)
{
struct ieee80211_txb *txb;
int i;
@@ -221,11 +221,13 @@ static struct ieee80211_txb *ieee80211_a
txb->frag_size = txb_size;

for (i = 0; i < nr_frags; i++) {
- txb->fragments[i] = dev_alloc_skb(txb_size);
+ txb->fragments[i] = __dev_alloc_skb(txb_size + headroom,
+ gfp_mask | GFP_DMA);
if (unlikely(!txb->fragments[i])) {
i--;
break;
}
+ skb_reserve(txb->fragments[i], headroom);
}
if (unlikely(i != nr_frags)) {
while (i >= 0)
@@ -350,7 +352,8 @@ int ieee80211_xmit(struct sk_buff *skb,
/* When we allocate the TXB we allocate enough space for the reserve
* and full fragment bytes (bytes_per_frag doesn't include prefix,
* postfix, header, FCS, etc.) */
- txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC);
+ txb = ieee80211_alloc_txb(nr_frags, frag_size,
+ ieee->tx_headroom, GFP_ATOMIC);
if (unlikely(!txb)) {
printk(KERN_WARNING "%s: Could not allocate TXB\n",
ieee->dev->name);

Signed-off-by: Michael Buesch <[email protected]>

--
Greetings Michael.


Attachments:
(No filename) (0.00 B)
(No filename) (189.00 B)
Download all attachments

2005-10-13 23:05:05

by Jeff Garzik

[permalink] [raw]
Subject: Re: [PATCH ieee80211] fix TX skb allocation flags and size

Michael Buesch wrote:
> @@ -221,11 +221,13 @@ static struct ieee80211_txb *ieee80211_a
> txb->frag_size = txb_size;
>
> for (i = 0; i < nr_frags; i++) {
> - txb->fragments[i] = dev_alloc_skb(txb_size);
> + txb->fragments[i] = __dev_alloc_skb(txb_size + headroom,
> + gfp_mask | GFP_DMA);
> if (unlikely(!txb->fragments[i])) {
> i--;

Very wrong. GFP_DMA means ISA DMA.

See pci_map_xxx() and other DMA API functions.

Jeff


2005-10-13 23:18:20

by Michael Buesch

[permalink] [raw]
Subject: Re: [PATCH ieee80211] fix TX skb allocation flags and size

On Friday 14 October 2005 01:04, you wrote:
> Michael Buesch wrote:
> > @@ -221,11 +221,13 @@ static struct ieee80211_txb *ieee80211_a
> > txb->frag_size = txb_size;
> >
> > for (i = 0; i < nr_frags; i++) {
> > - txb->fragments[i] = dev_alloc_skb(txb_size);
> > + txb->fragments[i] = __dev_alloc_skb(txb_size + headroom,
> > + gfp_mask | GFP_DMA);
> > if (unlikely(!txb->fragments[i])) {
> > i--;
>
> Very wrong. GFP_DMA means ISA DMA.
>
> See pci_map_xxx() and other DMA API functions.

Ok, the size issue is still valid and the real reason for doing this patch.
Please apply this:


ieee80211: Use tx_headroom

--- linux-2.6.14-rc4-git2/net/ieee80211/ieee80211_tx.c.orig 2005-10-13 22:45:13.000000000 +0200
+++ linux-2.6.14-rc4-git2/net/ieee80211/ieee80211_tx.c 2005-10-14 01:11:29.000000000 +0200
@@ -207,7 +207,7 @@ void ieee80211_txb_free(struct ieee80211
}

static struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size,
- gfp_t gfp_mask)
+ int headroom, gfp_t gfp_mask)
{
struct ieee80211_txb *txb;
int i;
@@ -221,11 +221,13 @@ static struct ieee80211_txb *ieee80211_a
txb->frag_size = txb_size;

for (i = 0; i < nr_frags; i++) {
- txb->fragments[i] = dev_alloc_skb(txb_size);
+ txb->fragments[i] = __dev_alloc_skb(txb_size + headroom,
+ gfp_mask);
if (unlikely(!txb->fragments[i])) {
i--;
break;
}
+ skb_reserve(txb->fragments[i], headroom);
}
if (unlikely(i != nr_frags)) {
while (i >= 0)
@@ -350,7 +352,8 @@ int ieee80211_xmit(struct sk_buff *skb,
/* When we allocate the TXB we allocate enough space for the reserve
* and full fragment bytes (bytes_per_frag doesn't include prefix,
* postfix, header, FCS, etc.) */
- txb = ieee80211_alloc_txb(nr_frags, frag_size, GFP_ATOMIC);
+ txb = ieee80211_alloc_txb(nr_frags, frag_size,
+ ieee->tx_headroom, GFP_ATOMIC);
if (unlikely(!txb)) {
printk(KERN_WARNING "%s: Could not allocate TXB\n",
ieee->dev->name);

Signed-off-by: Michael Buesch <[email protected]>

--
Greetings Michael.


Attachments:
(No filename) (0.00 B)
(No filename) (189.00 B)
Download all attachments