Message ID | 20240430194401.118950-1-marex@denx.de (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net,v2] net: ks8851: Queue RX packets in IRQ handler instead of disabling BHs | expand |
On Tue, 30 Apr 2024 21:43:34 +0200 Marek Vasut wrote: > diff --git a/drivers/net/ethernet/micrel/ks8851.h b/drivers/net/ethernet/micrel/ks8851.h > index 31f75b4a67fd7..f311074ea13bc 100644 > --- a/drivers/net/ethernet/micrel/ks8851.h > +++ b/drivers/net/ethernet/micrel/ks8851.h > @@ -399,6 +399,7 @@ struct ks8851_net { > > struct work_struct rxctrl_work; > > + struct sk_buff_head rxq; > struct sk_buff_head txq; > unsigned int queued_len; One more round, sorry, this structure has a kdoc, please fill in the description for the new member. > @@ -408,7 +406,8 @@ static irqreturn_t ks8851_irq(int irq, void *_ks) > if (status & IRQ_LCI) > mii_check_link(&ks->mii); > > - local_bh_enable(); > + while (!skb_queue_empty(&ks->rxq)) > + netif_rx(__skb_dequeue(&ks->rxq)); Personal preference and probably not worth retesting but FWIW I'd write this as: while ((skb = __skb_dequeue(&ks->rxq))) netif_rx(skb);
On Wed, May 1, 2024 at 4:10 AM Jakub Kicinski <kuba@kernel.org> wrote: > > On Tue, 30 Apr 2024 21:43:34 +0200 Marek Vasut wrote: > > diff --git a/drivers/net/ethernet/micrel/ks8851.h b/drivers/net/ethernet/micrel/ks8851.h > > index 31f75b4a67fd7..f311074ea13bc 100644 > > --- a/drivers/net/ethernet/micrel/ks8851.h > > +++ b/drivers/net/ethernet/micrel/ks8851.h > > @@ -399,6 +399,7 @@ struct ks8851_net { > > > > struct work_struct rxctrl_work; > > > > + struct sk_buff_head rxq; > > struct sk_buff_head txq; > > unsigned int queued_len; > > One more round, sorry, this structure has a kdoc, please fill in > the description for the new member. Alternative is to use a local (automatic variable on the stack) struct sk_buff_head, no need for permanent storage in struct ks8851_net > > > > @@ -408,7 +406,8 @@ static irqreturn_t ks8851_irq(int irq, void *_ks) > > if (status & IRQ_LCI) > > mii_check_link(&ks->mii); > > > > - local_bh_enable(); > > + while (!skb_queue_empty(&ks->rxq)) > > + netif_rx(__skb_dequeue(&ks->rxq)); > > Personal preference and probably not worth retesting but FWIW I'd write > this as: > > while ((skb = __skb_dequeue(&ks->rxq))) > netif_rx(skb); > -- > pw-bot: cr
On 5/1/24 4:39 AM, Eric Dumazet wrote: > On Wed, May 1, 2024 at 4:10 AM Jakub Kicinski <kuba@kernel.org> wrote: >> >> On Tue, 30 Apr 2024 21:43:34 +0200 Marek Vasut wrote: >>> diff --git a/drivers/net/ethernet/micrel/ks8851.h b/drivers/net/ethernet/micrel/ks8851.h >>> index 31f75b4a67fd7..f311074ea13bc 100644 >>> --- a/drivers/net/ethernet/micrel/ks8851.h >>> +++ b/drivers/net/ethernet/micrel/ks8851.h >>> @@ -399,6 +399,7 @@ struct ks8851_net { >>> >>> struct work_struct rxctrl_work; >>> >>> + struct sk_buff_head rxq; >>> struct sk_buff_head txq; >>> unsigned int queued_len; >> >> One more round, sorry, this structure has a kdoc, please fill in >> the description for the new member. > > Alternative is to use a local (automatic variable on the stack) struct > sk_buff_head, > no need for permanent storage in struct ks8851_net I think that's even better, done in V3 + addressed feedback from Jakub.
diff --git a/drivers/net/ethernet/micrel/ks8851.h b/drivers/net/ethernet/micrel/ks8851.h index 31f75b4a67fd7..f311074ea13bc 100644 --- a/drivers/net/ethernet/micrel/ks8851.h +++ b/drivers/net/ethernet/micrel/ks8851.h @@ -399,6 +399,7 @@ struct ks8851_net { struct work_struct rxctrl_work; + struct sk_buff_head rxq; struct sk_buff_head txq; unsigned int queued_len; diff --git a/drivers/net/ethernet/micrel/ks8851_common.c b/drivers/net/ethernet/micrel/ks8851_common.c index d4cdf3d4f5525..813a41193e3ce 100644 --- a/drivers/net/ethernet/micrel/ks8851_common.c +++ b/drivers/net/ethernet/micrel/ks8851_common.c @@ -299,7 +299,7 @@ static void ks8851_rx_pkts(struct ks8851_net *ks) ks8851_dbg_dumpkkt(ks, rxpkt); skb->protocol = eth_type_trans(skb, ks->netdev); - __netif_rx(skb); + __skb_queue_tail(&ks->rxq, skb); ks->netdev->stats.rx_packets++; ks->netdev->stats.rx_bytes += rxlen; @@ -330,8 +330,6 @@ static irqreturn_t ks8851_irq(int irq, void *_ks) unsigned long flags; unsigned int status; - local_bh_disable(); - ks8851_lock(ks, &flags); status = ks8851_rdreg16(ks, KS_ISR); @@ -408,7 +406,8 @@ static irqreturn_t ks8851_irq(int irq, void *_ks) if (status & IRQ_LCI) mii_check_link(&ks->mii); - local_bh_enable(); + while (!skb_queue_empty(&ks->rxq)) + netif_rx(__skb_dequeue(&ks->rxq)); return IRQ_HANDLED; } @@ -1189,6 +1188,7 @@ int ks8851_probe_common(struct net_device *netdev, struct device *dev, NETIF_MSG_PROBE | NETIF_MSG_LINK); + __skb_queue_head_init(&ks->rxq); skb_queue_head_init(&ks->txq); netdev->ethtool_ops = &ks8851_ethtool_ops;