Merge branch 'fix-sparse-warnings-in-dpaa_eth-driver'
Vladimir Oltean says: ==================== Fix sparse warnings in dpaa_eth driver This is a follow-up of the discussion at: https://lore.kernel.org/oe-kbuild-all/20241028-sticky-refined-lionfish-b06c0c@leitao/ where I said I would take care of the sparse warnings uncovered by Breno's COMPILE_TEST change for the dpaa_eth driver. There was one warning that I decided to treat as an actual bug: https://lore.kernel.org/netdev/20241029163105.44135-1-vladimir.oltean@nxp.com/ and what remains here are those warnings which I consider harmless. I would like Christophe to ack the entire series to be taken through netdev. I find it weird that the qbman driver, whose major API consumer is netdev, is maintained by a different group. In this case, the buggy qm_sg_entry_get_off() function is defined in qbman but exclusively called in netdev. ==================== Link: https://patch.msgid.link/20241029164317.50182-1-vladimir.oltean@nxp.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -1820,7 +1820,6 @@ static struct sk_buff *sg_fd_to_skb(const struct dpaa_priv *priv,
|
||||
struct page *page, *head_page;
|
||||
struct dpaa_bp *dpaa_bp;
|
||||
void *vaddr, *sg_vaddr;
|
||||
int frag_off, frag_len;
|
||||
struct sk_buff *skb;
|
||||
dma_addr_t sg_addr;
|
||||
int page_offset;
|
||||
@@ -1863,6 +1862,11 @@ static struct sk_buff *sg_fd_to_skb(const struct dpaa_priv *priv,
|
||||
* on Tx, if extra headers are added.
|
||||
*/
|
||||
WARN_ON(fd_off != priv->rx_headroom);
|
||||
/* The offset to data start within the buffer holding
|
||||
* the SGT should always be equal to the offset to data
|
||||
* start within the first buffer holding the frame.
|
||||
*/
|
||||
WARN_ON_ONCE(fd_off != qm_sg_entry_get_off(&sgt[i]));
|
||||
skb_reserve(skb, fd_off);
|
||||
skb_put(skb, qm_sg_entry_get_len(&sgt[i]));
|
||||
} else {
|
||||
@@ -1876,21 +1880,23 @@ static struct sk_buff *sg_fd_to_skb(const struct dpaa_priv *priv,
|
||||
page = virt_to_page(sg_vaddr);
|
||||
head_page = virt_to_head_page(sg_vaddr);
|
||||
|
||||
/* Compute offset in (possibly tail) page */
|
||||
/* Compute offset of sg_vaddr in (possibly tail) page */
|
||||
page_offset = ((unsigned long)sg_vaddr &
|
||||
(PAGE_SIZE - 1)) +
|
||||
(page_address(page) - page_address(head_page));
|
||||
/* page_offset only refers to the beginning of sgt[i];
|
||||
* but the buffer itself may have an internal offset.
|
||||
|
||||
/* Non-initial SGT entries should not have a buffer
|
||||
* offset.
|
||||
*/
|
||||
frag_off = qm_sg_entry_get_off(&sgt[i]) + page_offset;
|
||||
frag_len = qm_sg_entry_get_len(&sgt[i]);
|
||||
WARN_ON_ONCE(qm_sg_entry_get_off(&sgt[i]));
|
||||
|
||||
/* skb_add_rx_frag() does no checking on the page; if
|
||||
* we pass it a tail page, we'll end up with
|
||||
* bad page accounting and eventually with segafults.
|
||||
* bad page accounting and eventually with segfaults.
|
||||
*/
|
||||
skb_add_rx_frag(skb, i - 1, head_page, frag_off,
|
||||
frag_len, dpaa_bp->size);
|
||||
skb_add_rx_frag(skb, i - 1, head_page, page_offset,
|
||||
qm_sg_entry_get_len(&sgt[i]),
|
||||
dpaa_bp->size);
|
||||
}
|
||||
|
||||
/* Update the pool count for the current {cpu x bpool} */
|
||||
@@ -2766,7 +2772,7 @@ static enum qman_cb_dqrr_result rx_default_dqrr(struct qman_portal *portal,
|
||||
if (net_dev->features & NETIF_F_RXHASH && priv->keygen_in_use &&
|
||||
!fman_port_get_hash_result_offset(priv->mac_dev->port[RX],
|
||||
&hash_offset)) {
|
||||
hash = be32_to_cpu(*(u32 *)(vaddr + hash_offset));
|
||||
hash = be32_to_cpu(*(__be32 *)(vaddr + hash_offset));
|
||||
hash_valid = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -242,7 +242,7 @@ static inline void qm_sg_entry_set_f(struct qm_sg_entry *sg, int len)
|
||||
|
||||
static inline int qm_sg_entry_get_off(const struct qm_sg_entry *sg)
|
||||
{
|
||||
return be32_to_cpu(sg->offset) & QM_SG_OFF_MASK;
|
||||
return be16_to_cpu(sg->offset) & QM_SG_OFF_MASK;
|
||||
}
|
||||
|
||||
/* "Frame Dequeue Response" */
|
||||
|
||||
Reference in New Issue
Block a user