)]}'
{
  "commit": "f7fcc98dfc2d136722007fec0debbed761679b94",
  "tree": "abac7ea27b0b8414e427da2ed4995d1c14a85b80",
  "parents": [
    "4cd273bb91b3001f623f516ec726c49754571b1a"
  ],
  "author": {
    "name": "Florian Westphal",
    "email": "fw@strlen.de",
    "time": "Fri Dec 28 01:24:44 2018 +0100"
  },
  "committer": {
    "name": "Pablo Neira Ayuso",
    "email": "pablo@netfilter.org",
    "time": "Sat Dec 29 02:45:19 2018 +0100"
  },
  "message": "netfilter: nf_conncount: split gc in two phases\n\nThe lockless workqueue garbage collector can race with packet path\ngarbage collector to delete list nodes, as it calls tree_nodes_free()\nwith the addresses of nodes that might have been free\u0027d already from\nanother cpu.\n\nTo fix this, split gc into two phases.\n\nOne phase to perform gc on the connections: From a locking perspective,\nthis is the same as count_tree(): we hold rcu lock, but we do not\nchange the tree, we only change the nodes\u0027 contents.\n\nThe second phase acquires the tree lock and reaps empty nodes.\nThis avoids a race condition of the garbage collection vs.  packet path:\nIf a node has been free\u0027d already, the second phase won\u0027t find it anymore.\n\nThis second phase is, from locking perspective, same as insert_tree().\n\nThe former only modifies nodes (list content, count), latter modifies\nthe tree itself (rb_erase or rb_insert).\n\nFixes: 5c789e131cbb9 (\"netfilter: nf_conncount: Add list lock and gc worker, and RCU for init tree search\")\nReviewed-by: Shawn Bohrer \u003csbohrer@cloudflare.com\u003e\nSigned-off-by: Florian Westphal \u003cfw@strlen.de\u003e\nSigned-off-by: Pablo Neira Ayuso \u003cpablo@netfilter.org\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8bb4ed85c26204b857e3420401468e994f502457",
      "old_mode": 33188,
      "old_path": "net/netfilter/nf_conncount.c",
      "new_id": "753132e4afa814dbb3d204929948881420dad640",
      "new_mode": 33188,
      "new_path": "net/netfilter/nf_conncount.c"
    }
  ]
}
