diff -urN 01_kvec-v2.5.1-pre10/drivers/net/3c59x.c 02_kvec_net-v2.5.1-pre10/drivers/net/3c59x.c --- 01_kvec-v2.5.1-pre10/drivers/net/3c59x.c Fri Nov 9 16:41:42 2001 +++ 02_kvec_net-v2.5.1-pre10/drivers/net/3c59x.c Wed Dec 12 17:46:15 2001 @@ -1976,7 +1976,10 @@ /* Calculate the next Tx descriptor entry. */ int entry = vp->cur_tx % TX_RING_SIZE; struct boom_tx_desc *prev_entry = &vp->tx_ring[(vp->cur_tx-1) % TX_RING_SIZE]; + struct boom_tx_desc *desc = &vp->tx_ring[entry]; unsigned long flags; + int len, i; + void *buf; if (vortex_debug > 6) { printk(KERN_DEBUG "boomerang_start_xmit()\n"); @@ -1995,42 +1998,41 @@ vp->tx_skbuff[entry] = skb; - vp->tx_ring[entry].next = 0; + desc->next = 0; #if DO_ZEROCOPY if (skb->ip_summed != CHECKSUM_HW) - vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded); + desc->status = cpu_to_le32(skb->len | TxIntrUploaded); else - vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded | AddTCPChksum); + desc->status = cpu_to_le32(skb->len | TxIntrUploaded | AddTCPChksum); - if (!skb_shinfo(skb)->nr_frags) { - vp->tx_ring[entry].frag[0].addr = cpu_to_le32(pci_map_single(vp->pdev, skb->data, - skb->len, PCI_DMA_TODEVICE)); - vp->tx_ring[entry].frag[0].length = cpu_to_le32(skb->len | LAST_FRAG); - } else { - int i; - - vp->tx_ring[entry].frag[0].addr = cpu_to_le32(pci_map_single(vp->pdev, skb->data, - skb->len-skb->data_len, PCI_DMA_TODEVICE)); - vp->tx_ring[entry].frag[0].length = cpu_to_le32(skb->len-skb->data_len); - - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { - skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; - - vp->tx_ring[entry].frag[i+1].addr = - cpu_to_le32(pci_map_single(vp->pdev, - (void*)page_address(frag->page) + frag->page_offset, - frag->size, PCI_DMA_TODEVICE)); - - if (i == skb_shinfo(skb)->nr_frags-1) - vp->tx_ring[entry].frag[i+1].length = cpu_to_le32(frag->size|LAST_FRAG); - else - vp->tx_ring[entry].frag[i+1].length = cpu_to_le32(frag->size); - } + buf = skb->data; + len = skb->len; + if (skb_shinfo(skb)->nr_frags) + len -= skb->data_len; + + for (i=0; ; i++) { + skb_frag_t *frag; + u32 last = 0; + u32 addr = pci_map_single(vp->pdev, buf, len, PCI_DMA_TODEVICE); + + /* No more fragments? */ + if (i == skb_shinfo(skb)->nr_frags) + last = cpu_to_le32(LAST_FRAG); + + desc->frag[i].addr = cpu_to_le32(addr); + desc->frag[i].length = cpu_to_le32(len) | last; + + if (last) + break; + + frag = &skb_shinfo(skb)->frags[i]; + buf = page_address(skb_frag_page(frag)) + skb_frag_offset(frag); + len = skb_frag_length(frag); } #else - vp->tx_ring[entry].addr = cpu_to_le32(pci_map_single(vp->pdev, skb->data, skb->len, PCI_DMA_TODEVICE)); - vp->tx_ring[entry].length = cpu_to_le32(skb->len | LAST_FRAG); - vp->tx_ring[entry].status = cpu_to_le32(skb->len | TxIntrUploaded); + desc->addr = cpu_to_le32(pci_map_single(vp->pdev, skb->data, skb->len, PCI_DMA_TODEVICE)); + desc->length = cpu_to_le32(skb->len | LAST_FRAG); + desc->status = cpu_to_le32(skb->len | TxIntrUploaded); #endif spin_lock_irqsave(&vp->lock, flags); diff -urN 01_kvec-v2.5.1-pre10/drivers/net/8139cp.c 02_kvec_net-v2.5.1-pre10/drivers/net/8139cp.c --- 01_kvec-v2.5.1-pre10/drivers/net/8139cp.c Mon Nov 19 18:19:42 2001 +++ 02_kvec_net-v2.5.1-pre10/drivers/net/8139cp.c Wed Dec 12 17:58:27 2001 @@ -663,10 +663,10 @@ u32 len, mapping; u32 ctrl; - len = this_frag->size; + len = skb_frag_length(this_frag); mapping = pci_map_single(cp->pdev, - ((void *) page_address(this_frag->page) + - this_frag->page_offset), + (page_address(skb_frag_page(this_frag)) + + skb_frag_offset(this_frag)), len, PCI_DMA_TODEVICE); eor = (entry == (CP_TX_RING_SIZE - 1)) ? RingEnd : 0; #ifdef CP_TX_CHECKSUM diff -urN 01_kvec-v2.5.1-pre10/drivers/net/acenic.c 02_kvec_net-v2.5.1-pre10/drivers/net/acenic.c --- 01_kvec-v2.5.1-pre10/drivers/net/acenic.c Mon Nov 19 18:19:42 2001 +++ 02_kvec_net-v2.5.1-pre10/drivers/net/acenic.c Wed Dec 12 17:50:55 2001 @@ -2635,15 +2635,15 @@ skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; struct tx_ring_info *info; - len += frag->size; + len += skb_frag_length(frag); info = ap->skb->tx_skbuff + idx; desc = ap->tx_ring + idx; - mapping = pci_map_page(ap->pdev, frag->page, - frag->page_offset, frag->size, + mapping = pci_map_page(ap->pdev, skb_frag_page(frag), + skb_frag_offset(frag), skb_frag_length(frag), PCI_DMA_TODEVICE); - flagsize = (frag->size << 16); + flagsize = (skb_frag_length(frag) << 16); if (skb->ip_summed == CHECKSUM_HW) flagsize |= BD_FLG_TCP_UDP_SUM; idx = (idx + 1) % TX_RING_ENTRIES; @@ -2662,7 +2662,7 @@ info->skb = NULL; } info->mapping = mapping; - info->maplen = frag->size; + info->maplen = skb_frag_length(frag); ace_load_tx_bd(desc, mapping, flagsize); } } diff -urN 01_kvec-v2.5.1-pre10/drivers/net/ns83820.c 02_kvec_net-v2.5.1-pre10/drivers/net/ns83820.c --- 01_kvec-v2.5.1-pre10/drivers/net/ns83820.c Fri Nov 9 16:45:35 2001 +++ 02_kvec_net-v2.5.1-pre10/drivers/net/ns83820.c Wed Dec 12 17:28:29 2001 @@ -957,11 +957,13 @@ if (!nr_frags) break; - buf = pci_map_single_high(dev->pci_dev, frag->page, 0, - frag->size, PCI_DMA_TODEVICE); + buf = pci_map_single_high(dev->pci_dev, skb_frag_page(frag), + skb_frag_offset(frag), + skb_frag_length(frag), + PCI_DMA_TODEVICE); dprintk("frag: buf=%08Lx page=%08lx\n", (long long)buf, (long)(frag->page - mem_map)); - len = frag->size; + len = skb_frag_length(frag); frag++; nr_frags--; } diff -urN 01_kvec-v2.5.1-pre10/drivers/net/starfire.c 02_kvec_net-v2.5.1-pre10/drivers/net/starfire.c --- 01_kvec-v2.5.1-pre10/drivers/net/starfire.c Sun Sep 30 15:26:07 2001 +++ 02_kvec_net-v2.5.1-pre10/drivers/net/starfire.c Wed Dec 12 17:37:29 2001 @@ -1134,11 +1134,13 @@ if (skb_first_frag_len(skb) == 1) has_bad_length = 1; else { - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) - if (skb_shinfo(skb)->frags[i].size == 1) { + for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; + if (skb_frag_length(frag)) == 1) { has_bad_length = 1; break; } + } } if (has_bad_length) @@ -1188,13 +1190,17 @@ #ifdef ZEROCOPY for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { skb_frag_t *this_frag = &skb_shinfo(skb)->frags[i]; + void *addr = page_address(skb_frag_page(this_frag)) + + skb_frag_offset(this_frag); + int len = skb_frag_length(this_frag); /* we already have the proper value in entry */ np->tx_info[entry].frag_mapping[i] = - pci_map_single(np->pci_dev, page_address(this_frag->page) + this_frag->page_offset, this_frag->size, PCI_DMA_TODEVICE); + pci_map_single(np->pci_dev, addr, len, + PCI_DMA_TODEVICE); np->tx_ring[entry].frag[i].addr = cpu_to_le32(np->tx_info[entry].frag_mapping[i]); - np->tx_ring[entry].frag[i].len = cpu_to_le32(this_frag->size); + np->tx_ring[entry].frag[i].len = cpu_to_le32(len); if (debug > 5) { printk(KERN_DEBUG "%s: Tx #%d frag %d len %4.4x.\n", dev->name, np->cur_tx, i, diff -urN 01_kvec-v2.5.1-pre10/drivers/net/sungem.c 02_kvec_net-v2.5.1-pre10/drivers/net/sungem.c --- 01_kvec-v2.5.1-pre10/drivers/net/sungem.c Sun Oct 21 13:36:54 2001 +++ 02_kvec_net-v2.5.1-pre10/drivers/net/sungem.c Wed Dec 12 17:38:21 2001 @@ -714,10 +714,10 @@ dma_addr_t mapping; u64 this_ctrl; - len = this_frag->size; + len = skb_frag_length(this_frag); mapping = pci_map_page(gp->pdev, - this_frag->page, - this_frag->page_offset, + skb_frag_page(this_frag), + skb_frag_offset(this_frag), len, PCI_DMA_TODEVICE); this_ctrl = ctrl; if (frag == skb_shinfo(skb)->nr_frags - 1) diff -urN 01_kvec-v2.5.1-pre10/drivers/net/sunhme.c 02_kvec_net-v2.5.1-pre10/drivers/net/sunhme.c --- 01_kvec-v2.5.1-pre10/drivers/net/sunhme.c Fri Oct 12 18:35:53 2001 +++ 02_kvec_net-v2.5.1-pre10/drivers/net/sunhme.c Wed Dec 12 17:59:51 2001 @@ -2336,12 +2336,11 @@ for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) { skb_frag_t *this_frag = &skb_shinfo(skb)->frags[frag]; u32 len, mapping, this_txflags; + void *addr = page_address(skb_frag_page(this_frag)) + + skb_frag_offset(this_frag); - len = this_frag->size; - mapping = hme_dma_map(hp, - ((void *) page_address(this_frag->page) + - this_frag->page_offset), - len, DMA_TODEVICE); + len = skb_frag_length(this_frag); + mapping = hme_dma_map(hp, addr, len, DMA_TODEVICE); this_txflags = tx_flags; if (frag == skb_shinfo(skb)->nr_frags - 1) this_txflags |= TXFLAG_EOP; Binary files 01_kvec-v2.5.1-pre10/include/linux/.skbuff.h.swp and 02_kvec_net-v2.5.1-pre10/include/linux/.skbuff.h.swp differ diff -urN 01_kvec-v2.5.1-pre10/include/linux/skbuff.h 02_kvec_net-v2.5.1-pre10/include/linux/skbuff.h --- 01_kvec-v2.5.1-pre10/include/linux/skbuff.h Wed Dec 12 13:39:29 2001 +++ 02_kvec_net-v2.5.1-pre10/include/linux/skbuff.h Wed Dec 12 17:42:24 2001 @@ -107,14 +107,11 @@ #define MAX_SKB_FRAGS 6 -typedef struct skb_frag_struct skb_frag_t; +typedef struct kveclet skb_frag_t; -struct skb_frag_struct -{ - struct page *page; - __u16 page_offset; - __u16 size; -}; +#define skb_frag_page(f) ((f)->page) +#define skb_frag_offset(f) ((f)->offset) +#define skb_frag_length(f) ((f)->length) /* This data is invariant across clones and lives at * the end of the header data, ie. at skb->end. diff -urN 01_kvec-v2.5.1-pre10/net/core/datagram.c 02_kvec_net-v2.5.1-pre10/net/core/datagram.c --- 01_kvec-v2.5.1-pre10/net/core/datagram.c Thu Apr 12 15:11:39 2001 +++ 02_kvec_net-v2.5.1-pre10/net/core/datagram.c Wed Dec 12 17:52:04 2001 @@ -227,7 +227,7 @@ BUG_TRAP(start <= offset+len); - end = start + skb_shinfo(skb)->frags[i].size; + end = start + skb_shinfo(skb)->frags[i].length; if ((copy = end-offset) > 0) { int err; u8 *vaddr; @@ -237,7 +237,7 @@ if (copy > len) copy = len; vaddr = kmap(page); - err = memcpy_toiovec(to, vaddr + frag->page_offset + + err = memcpy_toiovec(to, vaddr + frag->offset + offset-start, copy); kunmap(page); if (err) @@ -303,7 +303,7 @@ BUG_TRAP(start <= offset+len); - end = start + skb_shinfo(skb)->frags[i].size; + end = start + skb_shinfo(skb)->frags[i].length; if ((copy = end-offset) > 0) { unsigned int csum2; int err = 0; @@ -314,8 +314,9 @@ if (copy > len) copy = len; vaddr = kmap(page); - csum2 = csum_and_copy_to_user(vaddr + frag->page_offset + - offset-start, to, copy, 0, &err); + csum2 = csum_and_copy_to_user(vaddr + frag->offset + + offset-start, to, copy, + 0, &err); kunmap(page); if (err) goto fault; diff -urN 01_kvec-v2.5.1-pre10/net/core/skbuff.c 02_kvec_net-v2.5.1-pre10/net/core/skbuff.c --- 01_kvec-v2.5.1-pre10/net/core/skbuff.c Tue Aug 7 11:30:50 2001 +++ 02_kvec_net-v2.5.1-pre10/net/core/skbuff.c Wed Dec 12 16:33:26 2001 @@ -744,7 +744,7 @@ int i; for (i=0; ifrags[i].size; + int end = offset + skb_shinfo(skb)->frags[i].length; if (end > len) { if (skb_cloned(skb)) { if (!realloc) @@ -756,7 +756,7 @@ put_page(skb_shinfo(skb)->frags[i].page); skb_shinfo(skb)->nr_frags--; } else { - skb_shinfo(skb)->frags[i].size = len-offset; + skb_shinfo(skb)->frags[i].length = len - offset; } } offset = end; @@ -833,9 +833,9 @@ /* Estimate size of pulled pages. */ eat = delta; for (i=0; inr_frags; i++) { - if (skb_shinfo(skb)->frags[i].size >= eat) + if (skb_shinfo(skb)->frags[i].length >= eat) goto pull_pages; - eat -= skb_shinfo(skb)->frags[i].size; + eat -= skb_shinfo(skb)->frags[i].length; } /* If we need update frag list, we are in troubles. @@ -900,14 +900,14 @@ eat = delta; k = 0; for (i=0; inr_frags; i++) { - if (skb_shinfo(skb)->frags[i].size <= eat) { + if (skb_shinfo(skb)->frags[i].length <= eat) { put_page(skb_shinfo(skb)->frags[i].page); - eat -= skb_shinfo(skb)->frags[i].size; + eat -= skb_shinfo(skb)->frags[i].length; } else { skb_shinfo(skb)->frags[k] = skb_shinfo(skb)->frags[i]; if (eat) { - skb_shinfo(skb)->frags[k].page_offset += eat; - skb_shinfo(skb)->frags[k].size -= eat; + skb_shinfo(skb)->frags[k].offset += eat; + skb_shinfo(skb)->frags[k].length -= eat; eat = 0; } k++; @@ -947,7 +947,7 @@ BUG_TRAP(start <= offset+len); - end = start + skb_shinfo(skb)->frags[i].size; + end = start + skb_shinfo(skb)->frags[i].length; if ((copy = end-offset) > 0) { u8 *vaddr; @@ -955,8 +955,8 @@ copy = len; vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]); - memcpy(to, vaddr+skb_shinfo(skb)->frags[i].page_offset+ - offset-start, copy); + memcpy(to, vaddr + skb_shinfo(skb)->frags[i].offset + + offset - start, copy); kunmap_skb_frag(vaddr); if ((len -= copy) == 0) @@ -1020,7 +1020,7 @@ BUG_TRAP(start <= offset+len); - end = start + skb_shinfo(skb)->frags[i].size; + end = start + skb_shinfo(skb)->frags[i].length; if ((copy = end-offset) > 0) { unsigned int csum2; u8 *vaddr; @@ -1029,8 +1029,8 @@ if (copy > len) copy = len; vaddr = kmap_skb_frag(frag); - csum2 = csum_partial(vaddr + frag->page_offset + - offset-start, copy, 0); + csum2 = csum_partial(vaddr + frag->offset + + offset - start, copy, 0); kunmap_skb_frag(vaddr); csum = csum_block_add(csum, csum2, pos); if (!(len -= copy)) @@ -1096,7 +1096,7 @@ BUG_TRAP(start <= offset+len); - end = start + skb_shinfo(skb)->frags[i].size; + end = start + skb_shinfo(skb)->frags[i].length; if ((copy = end-offset) > 0) { unsigned int csum2; u8 *vaddr; @@ -1105,7 +1105,7 @@ if (copy > len) copy = len; vaddr = kmap_skb_frag(frag); - csum2 = csum_partial_copy_nocheck(vaddr + frag->page_offset + + csum2 = csum_partial_copy_nocheck(vaddr + frag->offset + offset-start, to, copy, 0); kunmap_skb_frag(vaddr); csum = csum_block_add(csum, csum2, pos); diff -urN 01_kvec-v2.5.1-pre10/net/ipv4/ip_fragment.c 02_kvec_net-v2.5.1-pre10/net/ipv4/ip_fragment.c --- 01_kvec-v2.5.1-pre10/net/ipv4/ip_fragment.c Fri Sep 7 14:01:21 2001 +++ 02_kvec_net-v2.5.1-pre10/net/ipv4/ip_fragment.c Wed Dec 12 17:53:06 2001 @@ -542,7 +542,7 @@ skb_shinfo(clone)->frag_list = skb_shinfo(head)->frag_list; skb_shinfo(head)->frag_list = NULL; for (i=0; inr_frags; i++) - plen += skb_shinfo(head)->frags[i].size; + plen += skb_shinfo(head)->frags[i].length; clone->len = clone->data_len = head->data_len - plen; head->data_len -= clone->len; head->len -= clone->len; diff -urN 01_kvec-v2.5.1-pre10/net/ipv4/tcp.c 02_kvec_net-v2.5.1-pre10/net/ipv4/tcp.c --- 01_kvec-v2.5.1-pre10/net/ipv4/tcp.c Tue Oct 30 18:08:12 2001 +++ 02_kvec_net-v2.5.1-pre10/net/ipv4/tcp.c Wed Dec 12 16:35:31 2001 @@ -752,7 +752,7 @@ if (i) { skb_frag_t *frag = &skb_shinfo(skb)->frags[i-1]; return page == frag->page && - off == frag->page_offset+frag->size; + off == frag->offset + frag->length; } return 0; } @@ -762,8 +762,8 @@ { skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; frag->page = page; - frag->page_offset = off; - frag->size = size; + frag->offset = off; + frag->length = size; skb_shinfo(skb)->nr_frags = i+1; } @@ -872,7 +872,7 @@ i = skb_shinfo(skb)->nr_frags; if (can_coalesce(skb, i, page, offset)) { - skb_shinfo(skb)->frags[i-1].size += copy; + skb_shinfo(skb)->frags[i-1].length += copy; } else if (i < MAX_SKB_FRAGS) { get_page(page); fill_page_desc(skb, i, page, offset, copy); @@ -1135,7 +1135,7 @@ /* Update the skb. */ if (merge) { - skb_shinfo(skb)->frags[i-1].size += copy; + skb_shinfo(skb)->frags[i-1].length += copy; } else { fill_page_desc(skb, i, page, off, copy); if (TCP_PAGE(sk)) { diff -urN 01_kvec-v2.5.1-pre10/net/ipv4/tcp_output.c 02_kvec_net-v2.5.1-pre10/net/ipv4/tcp_output.c --- 01_kvec-v2.5.1-pre10/net/ipv4/tcp_output.c Mon Nov 5 12:46:12 2001 +++ 02_kvec_net-v2.5.1-pre10/net/ipv4/tcp_output.c Wed Dec 12 17:54:59 2001 @@ -382,7 +382,7 @@ skb->data_len = len - pos; for (i=0; ifrags[i].size; + int size = skb_shinfo(skb)->frags[i].length; if (pos + size > len) { skb_shinfo(skb1)->frags[k] = skb_shinfo(skb)->frags[i]; @@ -396,9 +396,9 @@ * 2. Split is accurately. We make this. */ get_page(skb_shinfo(skb)->frags[i].page); - skb_shinfo(skb1)->frags[0].page_offset += (len-pos); - skb_shinfo(skb1)->frags[0].size -= (len-pos); - skb_shinfo(skb)->frags[i].size = len-pos; + skb_shinfo(skb1)->frags[0].offset += (len-pos); + skb_shinfo(skb1)->frags[0].length -= (len-pos); + skb_shinfo(skb)->frags[i].length = len-pos; skb_shinfo(skb)->nr_frags++; } k++;