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.
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
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.