Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 27a884dc authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by David S. Miller
Browse files

[SK_BUFF]: Convert skb->tail to sk_buff_data_t



So that it is also an offset from skb->head, reduces its size from 8 to 4 bytes
on 64bit architectures, allowing us to combine the 4 bytes hole left by the
layer headers conversion, reducing struct sk_buff size to 256 bytes, i.e. 4
64byte cachelines, and since the sk_buff slab cache is SLAB_HWCACHE_ALIGN...
:-)

Many calculations that previously required that skb->{transport,network,
mac}_header be first converted to a pointer now can be done directly, being
meaningful as offsets or pointers.

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent be8bd863
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -264,7 +264,7 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg)

	dev_dbg(xpnet, "<skb->head=0x%p skb->data=0x%p skb->tail=0x%p "
		"skb->end=0x%p skb->len=%d\n", (void *) skb->head,
		(void *) skb->data, (void *) skb->tail, (void *) skb->end,
		(void *)skb->data, skb_tail_pointer(skb), (void *)skb->end,
		skb->len);

	skb->protocol = eth_type_trans(skb, xpnet_device);
@@ -272,7 +272,7 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg)

	dev_dbg(xpnet, "passing skb to network layer; \n\tskb->head=0x%p "
		"skb->data=0x%p skb->tail=0x%p skb->end=0x%p skb->len=%d\n",
		(void *) skb->head, (void *) skb->data, (void *) skb->tail,
		(void *)skb->head, (void *)skb->data, skb_tail_pointer(skb),
		(void *) skb->end, skb->len);


@@ -475,7 +475,7 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)

	dev_dbg(xpnet, ">skb->head=0x%p skb->data=0x%p skb->tail=0x%p "
		"skb->end=0x%p skb->len=%d\n", (void *) skb->head,
		(void *) skb->data, (void *) skb->tail, (void *) skb->end,
		(void *)skb->data, skb_tail_pointer(skb), (void *)skb->end,
		skb->len);


@@ -497,7 +497,7 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)

	/* get the beginning of the first cacheline and end of last */
	start_addr = ((u64) skb->data & ~(L1_CACHE_BYTES - 1));
	end_addr = L1_CACHE_ALIGN((u64) skb->tail);
	end_addr = L1_CACHE_ALIGN((u64)skb_tail_pointer(skb));

	/* calculate how many bytes to embed in the XPC message */
	embedded_bytes = 0;
@@ -573,7 +573,7 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
		msg->magic = XPNET_MAGIC;
		msg->size = end_addr - start_addr;
		msg->leadin_ignore = (u64) skb->data - start_addr;
		msg->tailout_ignore = end_addr - (u64) skb->tail;
		msg->tailout_ignore = end_addr - (u64)skb_tail_pointer(skb);
		msg->buf_pa = __pa(start_addr);

		dev_dbg(xpnet, "sending XPC message to %d:%d\nmsg->buf_pa="
+2 −2
Original line number Diff line number Diff line
@@ -1901,13 +1901,13 @@ he_service_rbrq(struct he_dev *he_dev, int group)
			case ATM_AAL0:
				/* 2.10.1.5 raw cell receive */
				skb->len = ATM_AAL0_SDU;
				skb->tail = skb->data + skb->len;
				skb_set_tail_pointer(skb, skb->len);
				break;
			case ATM_AAL5:
				/* 2.10.1.2 aal5 receive */

				skb->len = AAL5_LEN(skb->data, he_vcc->pdu_len);
				skb->tail = skb->data + skb->len;
				skb_set_tail_pointer(skb, skb->len);
#ifdef USE_CHECKSUM_HW
				if (vcc->vpi == 0 && vcc->vci >= ATM_NOT_RSV_VCI) {
					skb->ip_summed = CHECKSUM_COMPLETE;
+2 −1
Original line number Diff line number Diff line
@@ -1816,7 +1816,8 @@ push_rx_skb(struct idt77252_dev *card, struct sk_buff *skb, int queue)
	u32 handle;
	u32 addr;

	skb->data = skb->tail = skb->head;
	skb->data = skb->head;
	skb_reset_tail_pointer(skb);
	skb->len = 0;

	skb_reserve(skb, 16);
+6 −4
Original line number Diff line number Diff line
@@ -2208,7 +2208,7 @@ static void dequeue_rx(ns_dev *card, ns_rsqe *rsqe)
         if (i == 1 && ns_rsqe_eopdu(rsqe))
            *((u32 *) sb->data) |= 0x00000002;
         skb_put(sb, NS_AAL0_HEADER);
         memcpy(sb->tail, cell, ATM_CELL_PAYLOAD);
         memcpy(skb_tail_pointer(sb), cell, ATM_CELL_PAYLOAD);
         skb_put(sb, ATM_CELL_PAYLOAD);
         ATM_SKB(sb)->vcc = vcc;
	 __net_timestamp(sb);
@@ -2252,7 +2252,8 @@ static void dequeue_rx(ns_dev *card, ns_rsqe *rsqe)
      vc->rx_iov = iovb;
      NS_SKB(iovb)->iovcnt = 0;
      iovb->len = 0;
      iovb->tail = iovb->data = iovb->head;
      iovb->data = iovb->head;
      skb_reset_tail_pointer(iovb);
      NS_SKB(iovb)->vcc = vcc;
      /* IMPORTANT: a pointer to the sk_buff containing the small or large
                    buffer is stored as iovec base, NOT a pointer to the 
@@ -2265,7 +2266,8 @@ static void dequeue_rx(ns_dev *card, ns_rsqe *rsqe)
      recycle_iovec_rx_bufs(card, (struct iovec *) iovb->data, NS_MAX_IOVECS);
      NS_SKB(iovb)->iovcnt = 0;
      iovb->len = 0;
      iovb->tail = iovb->data = iovb->head;
      iovb->data = iovb->head;
      skb_reset_tail_pointer(iovb);
      NS_SKB(iovb)->vcc = vcc;
   }
   iov = &((struct iovec *) iovb->data)[NS_SKB(iovb)->iovcnt++];
@@ -2489,7 +2491,7 @@ static void dequeue_rx(ns_dev *card, ns_rsqe *rsqe)
            {
               lb = (struct sk_buff *) iov->iov_base;
               tocopy = min_t(int, remaining, iov->iov_len);
               memcpy(hb->tail, lb->data, tocopy);
               memcpy(skb_tail_pointer(hb), lb->data, tocopy);
               skb_put(hb, tocopy);
               iov++;
               remaining -= tocopy;
+3 −2
Original line number Diff line number Diff line
@@ -439,7 +439,8 @@ static void c2_rx_error(struct c2_port *c2_port, struct c2_element *elem)
	}

	/* Setup the skb for reuse since we're dropping this pkt */
	elem->skb->tail = elem->skb->data = elem->skb->head;
	elem->skb->data = elem->skb->head;
	skb_reset_tail_pointer(elem->skb);

	/* Zero out the rxp hdr in the sk_buff */
	memset(elem->skb->data, 0, sizeof(*rxp_hdr));
@@ -521,7 +522,7 @@ static void c2_rx_interrupt(struct net_device *netdev)
		 * "sizeof(struct c2_rxp_hdr)".
		 */
		skb->data += sizeof(*rxp_hdr);
		skb->tail = skb->data + buflen;
		skb_set_tail_pointer(skb, buflen);
		skb->len = buflen;
		skb->protocol = eth_type_trans(skb, netdev);

Loading