Skip to content

Commit

Permalink
Merge branch 'r8169-revert-two-commits-due-to-a-regression'
Browse files Browse the repository at this point in the history
Heiner Kallweit says:

====================
r8169: revert two commits due to a regression

Sander reported a regression (kernel panic, see[1]), therefore let's
revert these commits. Removal of the barriers doesn't seem to
contribute to the issue, the patch just overlaps with the problematic
one and only reverting both patches was tested.

[1] https://marc.info/?t=154965066400001&r=1&w=2

v2:
- improve commit message
====================

Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
davem330 committed Feb 10, 2019
2 parents ccc8ca9 + 0255d59 commit 31b58ad
Showing 1 changed file with 14 additions and 7 deletions.
21 changes: 14 additions & 7 deletions drivers/net/ethernet/realtek/r8169.c
Original file line number Diff line number Diff line change
Expand Up @@ -1286,11 +1286,13 @@ static u16 rtl_get_events(struct rtl8169_private *tp)
static void rtl_ack_events(struct rtl8169_private *tp, u16 bits)
{
RTL_W16(tp, IntrStatus, bits);
mmiowb();
}

static void rtl_irq_disable(struct rtl8169_private *tp)
{
RTL_W16(tp, IntrMask, 0);
mmiowb();
}

#define RTL_EVENT_NAPI_RX (RxOK | RxErr)
Expand Down Expand Up @@ -6072,7 +6074,6 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
struct device *d = tp_to_dev(tp);
dma_addr_t mapping;
u32 opts[2], len;
bool stop_queue;
int frags;

if (unlikely(!rtl_tx_slots_avail(tp, skb_shinfo(skb)->nr_frags))) {
Expand Down Expand Up @@ -6114,6 +6115,8 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,

txd->opts2 = cpu_to_le32(opts[1]);

netdev_sent_queue(dev, skb->len);

skb_tx_timestamp(skb);

/* Force memory writes to complete before releasing descriptor */
Expand All @@ -6126,14 +6129,16 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,

tp->cur_tx += frags + 1;

stop_queue = !rtl_tx_slots_avail(tp, MAX_SKB_FRAGS);
if (unlikely(stop_queue))
netif_stop_queue(dev);
RTL_W8(tp, TxPoll, NPQ);

if (__netdev_sent_queue(dev, skb->len, skb->xmit_more))
RTL_W8(tp, TxPoll, NPQ);
mmiowb();

if (unlikely(stop_queue)) {
if (!rtl_tx_slots_avail(tp, MAX_SKB_FRAGS)) {
/* Avoid wrongly optimistic queue wake-up: rtl_tx thread must
* not miss a ring update when it notices a stopped queue.
*/
smp_wmb();
netif_stop_queue(dev);
/* Sync with rtl_tx:
* - publish queue status and cur_tx ring index (write barrier)
* - refresh dirty_tx ring index (read barrier).
Expand Down Expand Up @@ -6483,7 +6488,9 @@ static int rtl8169_poll(struct napi_struct *napi, int budget)

if (work_done < budget) {
napi_complete_done(napi, work_done);

rtl_irq_enable(tp);
mmiowb();
}

return work_done;
Expand Down

0 comments on commit 31b58ad

Please sign in to comment.