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

Commit ec47ea82 authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller
Browse files

skb: Add inline helper for getting the skb end offset from head



With the recent changes for how we compute the skb truesize it occurs to me
we are probably going to have a lot of calls to skb_end_pointer -
skb->head.  Instead of running all over the place doing that it would make
more sense to just make it a separate inline skb_end_offset(skb) that way
we can return the correct value without having gcc having to do all the
optimization to cancel out skb->head - skb->head.

Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
Acked-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3e24591a
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -802,7 +802,7 @@ static void fill_rx_pool (amb_dev * dev, unsigned char pool,
    }
    }
    // cast needed as there is no %? for pointer differences
    // cast needed as there is no %? for pointer differences
    PRINTD (DBG_SKB, "allocated skb at %p, head %p, area %li",
    PRINTD (DBG_SKB, "allocated skb at %p, head %p, area %li",
	    skb, skb->head, (long) (skb_end_pointer(skb) - skb->head));
	    skb, skb->head, (long) skb_end_offset(skb));
    rx.handle = virt_to_bus (skb);
    rx.handle = virt_to_bus (skb);
    rx.host_address = cpu_to_be32 (virt_to_bus (skb->data));
    rx.host_address = cpu_to_be32 (virt_to_bus (skb->data));
    if (rx_give (dev, &rx, pool))
    if (rx_give (dev, &rx, pool))
+1 −1
Original line number Original line Diff line number Diff line
@@ -1258,7 +1258,7 @@ idt77252_rx_raw(struct idt77252_dev *card)
	tail = readl(SAR_REG_RAWCT);
	tail = readl(SAR_REG_RAWCT);


	pci_dma_sync_single_for_cpu(card->pcidev, IDT77252_PRV_PADDR(queue),
	pci_dma_sync_single_for_cpu(card->pcidev, IDT77252_PRV_PADDR(queue),
				    skb_end_pointer(queue) - queue->head - 16,
				    skb_end_offset(queue) - 16,
				    PCI_DMA_FROMDEVICE);
				    PCI_DMA_FROMDEVICE);


	while (head != tail) {
	while (head != tail) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -277,7 +277,7 @@ retry:
		d_printf(1, dev, "RX: size changed to %d, received %d, "
		d_printf(1, dev, "RX: size changed to %d, received %d, "
			 "copied %d, capacity %ld\n",
			 "copied %d, capacity %ld\n",
			 rx_size, read_size, rx_skb->len,
			 rx_size, read_size, rx_skb->len,
			 (long) (skb_end_pointer(new_skb) - new_skb->head));
			 (long) skb_end_offset(new_skb));
		goto retry;
		goto retry;
	}
	}
		/* In most cases, it happens due to the hardware scheduling a
		/* In most cases, it happens due to the hardware scheduling a
+1 −1
Original line number Original line Diff line number Diff line
@@ -344,7 +344,7 @@ int cvm_oct_xmit(struct sk_buff *skb, struct net_device *dev)
	}
	}
	if (unlikely
	if (unlikely
	    (skb->truesize !=
	    (skb->truesize !=
	     sizeof(*skb) + skb_end_pointer(skb) - skb->head)) {
	     sizeof(*skb) + skb_end_offset(skb))) {
		/*
		/*
		   printk("TX buffer truesize has been changed\n");
		   printk("TX buffer truesize has been changed\n");
		 */
		 */
+11 −1
Original line number Original line Diff line number Diff line
@@ -645,11 +645,21 @@ static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
{
{
	return skb->head + skb->end;
	return skb->head + skb->end;
}
}

static inline unsigned int skb_end_offset(const struct sk_buff *skb)
{
	return skb->end;
}
#else
#else
static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
static inline unsigned char *skb_end_pointer(const struct sk_buff *skb)
{
{
	return skb->end;
	return skb->end;
}
}

static inline unsigned int skb_end_offset(const struct sk_buff *skb)
{
	return skb->end - skb->head;
}
#endif
#endif


/* Internal */
/* Internal */
@@ -2558,7 +2568,7 @@ static inline bool skb_is_recycleable(const struct sk_buff *skb, int skb_size)
		return false;
		return false;


	skb_size = SKB_DATA_ALIGN(skb_size + NET_SKB_PAD);
	skb_size = SKB_DATA_ALIGN(skb_size + NET_SKB_PAD);
	if (skb_end_pointer(skb) - skb->head < skb_size)
	if (skb_end_offset(skb) < skb_size)
		return false;
		return false;


	if (skb_shared(skb) || skb_cloned(skb))
	if (skb_shared(skb) || skb_cloned(skb))
Loading