940-cleanup-offload-hooks-on-netdev-unregister.patch 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. From ae56e27e30122f82d244f9eb35fcab8fa60e0d31 Mon Sep 17 00:00:00 2001
  2. From: Chen Minqiang <[email protected]>
  3. Date: Sun, 29 Apr 2018 14:08:57 +0800
  4. Subject: [PATCH] cleanup offload hooks on netdev unregister
  5. This should fix crashdump on reboot when FLOWOFFLOAD enabled
  6. kmsg:
  7. [ 84.188081] Workqueue: events_power_efficient xt_flowoffload_hook_work [xt_FLOWOFFLOAD]
  8. [ 84.209326] task: ffff88000ecd0c80 task.stack: ffffc90000068000
  9. [ 84.224706] RIP: 0010:__nf_unregister_net_hook+0x1/0x90
  10. [ 84.242911] RSP: 0018:ffffc9000006be30 EFLAGS: 00010202
  11. [ 84.257405] RAX: 0000000000000000 RBX: ffff88000c5b3228 RCX: 0000000100170001
  12. [ 84.292175] RDX: ffff88000ecd0c80 RSI: ffff88000c5b3228 RDI: 6b6b6b6b6b6b6b6b
  13. [ 84.305095] RBP: ffffc9000006be58 R08: ffff88000c5b3578 R09: ffff88000c5b3538
  14. [ 84.325980] R10: ffffc9000006be50 R11: ffff88000fc1f310 R12: ffffffff81e6c580
  15. [ 84.396514] R13: ffff88000d1723d0 R14: ffff88000ec0fc00 R15: 0000000000000000
  16. [ 84.459500] FS: 0000000000000000(0000) GS:ffff88000fc00000(0000) knlGS:0000000000000000
  17. [ 84.525121] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
  18. [ 84.565460] CR2: 0000000000a931d8 CR3: 0000000001e08006 CR4: 00000000000606f0
  19. [ 84.638311] Call Trace:
  20. [ 84.655229] ? nf_unregister_net_hook+0x88/0xd0
  21. [ 84.706898] xt_flowoffload_hook_work+0x12a/0x17a [xt_FLOWOFFLOAD]
  22. [ 84.765504] process_one_work+0x1c4/0x310
  23. [ 84.799558] worker_thread+0x20b/0x3c0
  24. [ 84.850119] kthread+0x112/0x120
  25. [ 84.884839] ? process_one_work+0x310/0x310
  26. [ 84.923571] ? kthread_create_on_node+0x40/0x40
  27. [ 84.966100] ret_from_fork+0x35/0x40
  28. [ 84.981738] Code: 41 5c 41 5d 41 5e 41 5f 5d c3 48 8b 05 c1 f1 99 00 55 48 89 e5 48 85 c0 75 02 0f 0b e8 b9 f6 30 00 5d c3 0f 1f 80 00 00 00 00 55 <0f> b7 0f 48 89 e5 48 89 c8 48 c1 e0 04 48 8d 54 07 08 31 c0 eb
  29. [ 85.100453] RIP: __nf_unregister_net_hook+0x1/0x90 RSP: ffffc9000006be30
  30. [ 85.111658] ---[ end trace 5c25a390045cac75 ]---
  31. [ 85.124535] Kernel panic - not syncing: Fatal exception
  32. Signed-off-by: Chen Minqiang <[email protected]>
  33. ---
  34. net/netfilter/xt_FLOWOFFLOAD.c | 32 ++++++++++++++++++++++++++++++++
  35. 1 file changed, 32 insertions(+)
  36. --- a/net/netfilter/xt_FLOWOFFLOAD.c
  37. +++ b/net/netfilter/xt_FLOWOFFLOAD.c
  38. @@ -338,10 +338,41 @@ static void xt_flowoffload_table_cleanup
  39. nf_flow_table_free(table);
  40. }
  41. +static int flow_offload_netdev_event(struct notifier_block *this,
  42. + unsigned long event, void *ptr)
  43. +{
  44. + struct xt_flowoffload_hook *hook = NULL;
  45. + struct net_device *dev = netdev_notifier_info_to_dev(ptr);
  46. +
  47. + if (event != NETDEV_UNREGISTER)
  48. + return NOTIFY_DONE;
  49. +
  50. + spin_lock_bh(&hooks_lock);
  51. + hook = flow_offload_lookup_hook(dev);
  52. + if (hook) {
  53. + hlist_del(&hook->list);
  54. + }
  55. + spin_unlock_bh(&hooks_lock);
  56. + if (hook) {
  57. + nf_unregister_net_hook(hook->net, &hook->ops);
  58. + kfree(hook);
  59. + }
  60. +
  61. + nf_flow_table_cleanup(dev_net(dev), dev);
  62. +
  63. + return NOTIFY_DONE;
  64. +}
  65. +
  66. +static struct notifier_block flow_offload_netdev_notifier = {
  67. + .notifier_call = flow_offload_netdev_event,
  68. +};
  69. +
  70. static int __init xt_flowoffload_tg_init(void)
  71. {
  72. int ret;
  73. + register_netdevice_notifier(&flow_offload_netdev_notifier);
  74. +
  75. INIT_DELAYED_WORK(&hook_work, xt_flowoffload_hook_work);
  76. ret = xt_flowoffload_table_init(&nf_flowtable);
  77. @@ -359,6 +390,7 @@ static void __exit xt_flowoffload_tg_exi
  78. {
  79. xt_unregister_target(&offload_tg_reg);
  80. xt_flowoffload_table_cleanup(&nf_flowtable);
  81. + unregister_netdevice_notifier(&flow_offload_netdev_notifier);
  82. }
  83. MODULE_LICENSE("GPL");