Advertisement
Guest User

Untitled

a guest
Sep 19th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 3.48 KB | None | 0 0
  1. From 904e36e2c6e87c7b9138570ab19a97189cc58af3 Mon Sep 17 00:00:00 2001
  2. From: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
  3. Date: Wed, 19 Sep 2018 22:26:11 +0200
  4. Subject: [PATCH] mt76: usb: make rx page_frag_cache access atomic
  5.  
  6. Make rx page fragment access atomic in order to fix
  7. the following crash that occasionally occurs if the
  8. device is rebooted with the usb dongle connected
  9.  
  10. [ 2614.207939] BUG: Bad page state in process kworker/3:0  pfn:3ee9e8
  11. [ 2614.207941] page:ffffe061cfba7a00 count:-1 mapcount:0 mapping:0000000000000000 index:0x0
  12. [ 2614.207975] flags: 0x17ffc0000000000()
  13. [ 2614.207994] raw: 017ffc0000000000 dead000000000100 dead000000000200 0000000000000000
  14. [ 2614.207995] raw: 0000000000000000 0000000000000000 ffffffffffffffff 0000000000000000
  15. [ 2614.207996] page dumped because: nonzero _count
  16. [ 2614.208119] CPU: 3 PID: 7754 Comm: kworker/3:0 Tainted: G T 4.19.0-rc1-gfaedbfa17bec-dirty #3
  17. [ 2614.208120] Hardware name:  /NUC5i5MYBE, BIOS MYBDWi5v.86A.0024.2015.0504.1120 05/04/2015
  18. [ 2614.208124] Workqueue: usb_hub_wq hub_event
  19. [ 2614.208125] Call Trace:
  20. [ 2614.208129]  dump_stack+0x5c/0x7b
  21. [ 2614.208133]  bad_page+0xbf/0x120
  22. [ 2614.208135]  get_page_from_freelist+0xf5f/0x13e0
  23. [ 2614.208137]  __alloc_pages_nodemask+0x12f/0xdd0
  24. [ 2614.208144]  page_frag_alloc+0x84/0x140
  25. [ 2614.208148]  mt76u_fill_rx_sg.isra.1+0x55/0x200 [mt76_usb]
  26. [ 2614.208150]  mt76u_alloc_queues+0xaf/0x1e0 [mt76_usb]
  27. [ 2614.208153]  mt76x2u_register_device+0xe4/0x1c0 [mt76x2u]
  28. [ 2614.208155]  mt76x2u_probe+0x86/0xd0 [mt76x2u]
  29. [ 2614.208158]  usb_probe_interface+0xe2/0x2a0
  30. [ 2614.208159]  really_probe+0x1d1/0x2c0
  31. [ 2614.208162]  driver_probe_device+0x4a/0xe0
  32. [ 2614.208166]  bus_for_each_drv+0x72/0xb0
  33. [ 2614.208167]  __device_attach+0xe5/0x140
  34. [ 2614.208170]  bus_probe_device+0x85/0xa0
  35. [ 2614.208172]  device_add+0x479/0x660
  36. [ 2614.208174]  usb_set_configuration+0x537/0x850
  37. [ 2614.208177]  generic_probe+0x23/0x70
  38. [ 2614.208178]  really_probe+0x1d1/0x2c0
  39. [ 2614.208181]  driver_probe_device+0x4a/0xe0
  40. [ 2614.208184]  bus_for_each_drv+0x72/0xb0
  41. [ 2614.208185]  __device_attach+0xe5/0x140
  42. [ 2614.208187]  bus_probe_device+0x85/0xa0
  43. [ 2614.208189]  device_add+0x479/0x660
  44. [ 2614.208191]  usb_new_device+0x296/0x5e0
  45. [ 2614.208193]  hub_event+0xf88/0x1340
  46. [ 2614.208196]  process_one_work+0x16f/0x300
  47. [ 2614.208198]  worker_thread+0x2b/0x390
  48. [ 2614.208201]  kthread+0x106/0x120
  49. [ 2614.208205]  ret_from_fork+0x35/0x40
  50. [ 2614.208207] Disabling lock debugging due to kernel taint
  51.  
  52. Fixes: ("mt76: use a per rx queue page fragment cache")
  53. Signed-off-by: Lorenzo Bianconi <lorenzo.bianconi@redhat.com>
  54. ---
  55. drivers/net/wireless/mediatek/mt76/usb.c | 3 +++
  56.  1 file changed, 3 insertions(+)
  57.  
  58. diff --git a/drivers/net/wireless/mediatek/mt76/usb.c b/drivers/net/wireless/mediatek/mt76/usb.c
  59. index b3edd645b3c0..02206c2a6a1e 100644
  60. --- a/drivers/net/wireless/mediatek/mt76/usb.c
  61. +++ b/drivers/net/wireless/mediatek/mt76/usb.c
  62. @@ -277,8 +277,10 @@ mt76u_fill_rx_sg(struct mt76_dev *dev, struct mt76u_buf *buf,
  63.  {
  64.     struct mt76_queue *q = &dev->q_rx[MT_RXQ_MAIN];
  65.     struct urb *urb = buf->urb;
  66. +   unsigned long flags;
  67.     int i;
  68.  
  69. +   spin_lock_irqsave(&q->lock, flags);
  70.     for (i = 0; i < nsgs; i++) {
  71.         struct page *page;
  72.         void *data;
  73. @@ -292,6 +294,7 @@ mt76u_fill_rx_sg(struct mt76_dev *dev, struct mt76u_buf *buf,
  74.         offset = data - page_address(page);
  75.         sg_set_page(&urb->sg[i], page, sglen, offset);
  76.     }
  77. +   spin_unlock_irqrestore(&q->lock, flags);
  78.  
  79.     if (i < nsgs) {
  80.         int j;
  81. --
  82. 2.18.0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement