)]}'
{
  "log": [
    {
      "commit": "6fec10a1a5866dda3cd6a825a521fc7c2f226ba5",
      "tree": "f45c465a2d5f04e5052324efd114ac07cd668a41",
      "parents": [
        "46f3d976213452350f9d10b0c2780c2681f7075b"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Sun Jul 22 10:16:34 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Sun Jul 22 10:16:34 2012 -0700"
      },
      "message": "workqueue: fix spurious CPU locality WARN from process_one_work()\n\n25511a4776 \"workqueue: reimplement CPU online rebinding to handle idle\nworkers\" added CPU locality sanity check in process_one_work().  It\ntriggers if a worker is executing on a different CPU without UNBOUND\nor REBIND set.\n\nThis works for all normal workers but rescuers can trigger this\nspuriously when they\u0027re serving the unbound or a disassociated\nglobal_cwq - rescuers don\u0027t have either flag set and thus its\ngcwq-\u003ecpu can be a different value including %WORK_CPU_UNBOUND.\n\nFix it by additionally testing %GCWQ_DISASSOCIATED.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: \"Paul E. McKenney\" \u003cpaulmck@linux.vnet.ibm.com\u003e\nLKML-Refence: \u003c20120721213656.GA7783@linux.vnet.ibm.com\u003e\n"
    },
    {
      "commit": "8db25e7891a47e03db6f04344a9c92be16e391bb",
      "tree": "e093119c71e655b54b159fed76b654a437b1ff30",
      "parents": [
        "628c78e7ea19d5b70d2b6a59030362168cdbe1ad"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:28 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:28 2012 -0700"
      },
      "message": "workqueue: simplify CPU hotplug code\n\nWith trustee gone, CPU hotplug code can be simplified.\n\n* gcwq_claim/release_management() now grab and release gcwq lock too\n  respectively and gained _and_lock and _and_unlock postfixes.\n\n* All CPU hotplug logic was implemented in workqueue_cpu_callback()\n  which was called by workqueue_cpu_up/down_callback() for the correct\n  priority.  This was because up and down paths shared a lot of logic,\n  which is no longer true.  Remove workqueue_cpu_callback() and move\n  all hotplug logic into the two actual callbacks.\n\nThis patch doesn\u0027t make any functional changes.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nAcked-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\n"
    },
    {
      "commit": "628c78e7ea19d5b70d2b6a59030362168cdbe1ad",
      "tree": "7867a9f82aae3d31c40356f32ae24223ae0ddf0c",
      "parents": [
        "3ce63377305b694f53e7dd0c72907591c5344224"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "message": "workqueue: remove CPU offline trustee\n\nWith the previous changes, a disassociated global_cwq now can run as\nan unbound one on its own - it can create workers as necessary to\ndrain remaining works after the CPU has been brought down and manage\nthe number of workers using the usual idle timer mechanism making\ntrustee completely redundant except for the actual unbinding\noperation.\n\nThis patch removes the trustee and let a disassociated global_cwq\nmanage itself.  Unbinding is moved to a work item (for CPU affinity)\nwhich is scheduled and flushed from CPU_DONW_PREPARE.\n\nThis patch moves nr_running clearing outside gcwq and manager locks to\nsimplify the code.  As nr_running is unused at the point, this is\nsafe.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nAcked-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\n"
    },
    {
      "commit": "3ce63377305b694f53e7dd0c72907591c5344224",
      "tree": "bee43bee96418ebdff5f7ad678584628fd86c52e",
      "parents": [
        "25511a477657884d2164f338341fa89652610507"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "message": "workqueue: don\u0027t butcher idle workers on an offline CPU\n\nCurrently, during CPU offlining, after all pending work items are\ndrained, the trustee butchers all workers.  Also, on CPU onlining\nfailure, workqueue_cpu_callback() ensures that the first idle worker\nis destroyed.  Combined, these guarantee that an offline CPU doesn\u0027t\nhave any worker for it once all the lingering work items are finished.\n\nThis guarantee isn\u0027t really necessary and makes CPU on/offlining more\nexpensive than needs to be, especially for platforms which use CPU\nhotplug for powersaving.\n\nThis patch lets offline CPUs removes idle worker butchering from the\ntrustee and let a CPU which failed onlining keep the created first\nworker.  The first worker is created if the CPU doesn\u0027t have any\nduring CPU_DOWN_PREPARE and started right away.  If onlining succeeds,\nthe rebind_workers() call in CPU_ONLINE will rebind it like any other\nworkers.  If onlining fails, the worker is left alone till the next\ntry.\n\nThis makes CPU hotplugs cheaper by allowing global_cwqs to keep\nworkers across them and simplifies code.\n\nNote that trustee doesn\u0027t re-arm idle timer when it\u0027s done and thus\nthe disassociated global_cwq will keep all workers until it comes back\nonline.  This will be improved by further patches.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nAcked-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\n"
    },
    {
      "commit": "25511a477657884d2164f338341fa89652610507",
      "tree": "dbea343f762f154c28b6db423f0220f090d94d60",
      "parents": [
        "bc2ae0f5bb2f39e6db06a62f9d353e4601a332a1"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "message": "workqueue: reimplement CPU online rebinding to handle idle workers\n\nCurrently, if there are left workers when a CPU is being brough back\nonline, the trustee kills all idle workers and scheduled rebind_work\nso that they re-bind to the CPU after the currently executing work is\nfinished.  This works for busy workers because concurrency management\ndoesn\u0027t try to wake up them from scheduler callbacks, which require\nthe target task to be on the local run queue.  The busy worker bumps\nconcurrency counter appropriately as it clears WORKER_UNBOUND from the\nrebind work item and it\u0027s bound to the CPU before returning to the\nidle state.\n\nTo reduce CPU on/offlining overhead (as many embedded systems use it\nfor powersaving) and simplify the code path, workqueue is planned to\nbe modified to retain idle workers across CPU on/offlining.  This\npatch reimplements CPU online rebinding such that it can also handle\nidle workers.\n\nAs noted earlier, due to the local wakeup requirement, rebinding idle\nworkers is tricky.  All idle workers must be re-bound before scheduler\ncallbacks are enabled.  This is achieved by interlocking idle\nre-binding.  Idle workers are requested to re-bind and then hold until\nall idle re-binding is complete so that no bound worker starts\nexecuting work item.  Only after all idle workers are re-bound and\nparked, CPU_ONLINE proceeds to release them and queue rebind work item\nto busy workers thus guaranteeing scheduler callbacks aren\u0027t invoked\nuntil all idle workers are ready.\n\nworker_rebind_fn() is renamed to busy_worker_rebind_fn() and\nidle_worker_rebind() for idle workers is added.  Rebinding logic is\nmoved to rebind_workers() and now called from CPU_ONLINE after\nflushing trustee.  While at it, add CPU sanity check in\nworker_thread().\n\nNote that now a worker may become idle or the manager between trustee\nrelease and rebinding during CPU_ONLINE.  As the previous patch\nupdated create_worker() so that it can be used by regular manager\nwhile unbound and this patch implements idle re-binding, this is safe.\n\nThis prepares for removal of trustee and keeping idle workers across\nCPU hotplugs.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nAcked-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\n"
    },
    {
      "commit": "bc2ae0f5bb2f39e6db06a62f9d353e4601a332a1",
      "tree": "3f1aa1f72566ac67234799fdd811ba63297de33c",
      "parents": [
        "6037315269d62bf967286ae2670fdd6b6acedab9"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "message": "workqueue: drop @bind from create_worker()\n\nCurrently, create_worker()\u0027s callers are responsible for deciding\nwhether the newly created worker should be bound to the associated CPU\nand create_worker() sets WORKER_UNBOUND only for the workers for the\nunbound global_cwq.  Creation during normal operation is always via\nmaybe_create_worker() and @bind is true.  For workers created during\nhotplug, @bind is false.\n\nNormal operation path is planned to be used even while the CPU is\ngoing through hotplug operations or offline and this static decision\nwon\u0027t work.\n\nDrop @bind from create_worker() and decide whether to bind by looking\nat GCWQ_DISASSOCIATED.  create_worker() will also set WORKER_UNBOUND\nautmatically if disassociated.  To avoid flipping GCWQ_DISASSOCIATED\nwhile create_worker() is in progress, the flag is now allowed to be\nchanged only while holding all manager_mutexes on the global_cwq.\n\nThis requires that GCWQ_DISASSOCIATED is not cleared behind trustee\u0027s\nback.  CPU_ONLINE no longer clears DISASSOCIATED before flushing\ntrustee, which clears DISASSOCIATED before rebinding remaining workers\nif asked to release.  For cases where trustee isn\u0027t around, CPU_ONLINE\nclears DISASSOCIATED after flushing trustee.  Also, now, first_idle\nhas UNBOUND set on creation which is explicitly cleared by CPU_ONLINE\nwhile binding it.  These convolutions will soon be removed by further\nsimplification of CPU hotplug path.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nAcked-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\n"
    },
    {
      "commit": "6037315269d62bf967286ae2670fdd6b6acedab9",
      "tree": "c476298b57c0a33aa7fe3c898d62ce17eb11d2ad",
      "parents": [
        "403c821d452c03be4ced571ac91339a9d3631b17"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "message": "workqueue: use mutex for global_cwq manager exclusion\n\nPOOL_MANAGING_WORKERS is used to ensure that at most one worker takes\nthe manager role at any given time on a given global_cwq.  Trustee\nlater hitched on it to assume manager adding blocking wait for the\nbit.  As trustee already needed a custom wait mechanism, waiting for\nMANAGING_WORKERS was rolled into the same mechanism.\n\nTrustee is scheduled to be removed.  This patch separates out\nMANAGING_WORKERS wait into per-pool mutex.  Workers use\nmutex_trylock() to test for manager role and trustee uses mutex_lock()\nto claim manager roles.\n\ngcwq_claim/release_management() helpers are added to grab and release\nmanager roles of all pools on a global_cwq.  gcwq_claim_management()\nalways grabs pool manager mutexes in ascending pool index order and\nuses pool index as lockdep subclass.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nAcked-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\n"
    },
    {
      "commit": "403c821d452c03be4ced571ac91339a9d3631b17",
      "tree": "022cf4ff47b9652ca550498dc896672c1cec8d05",
      "parents": [
        "f2d5a0ee06c1813f985bb9386f3ccc0d0315720f"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:27 2012 -0700"
      },
      "message": "workqueue: ROGUE workers are UNBOUND workers\n\nCurrently, WORKER_UNBOUND is used to mark workers for the unbound\nglobal_cwq and WORKER_ROGUE is used to mark workers for disassociated\nper-cpu global_cwqs.  Both are used to make the marked worker skip\nconcurrency management and the only place they make any difference is\nin worker_enter_idle() where WORKER_ROGUE is used to skip scheduling\nidle timer, which can easily be replaced with trustee state testing.\n\nThis patch replaces WORKER_ROGUE with WORKER_UNBOUND and drops\nWORKER_ROGUE.  This is to prepare for removing trustee and handling\ndisassociated global_cwqs as unbound.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nAcked-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\n"
    },
    {
      "commit": "f2d5a0ee06c1813f985bb9386f3ccc0d0315720f",
      "tree": "4207975fe000f95931b0c6876657db5b13f92b73",
      "parents": [
        "6575820221f7a4dd6eadecf7bf83cdd154335eda"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:26 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:26 2012 -0700"
      },
      "message": "workqueue: drop CPU_DYING notifier operation\n\nWorkqueue used CPU_DYING notification to mark GCWQ_DISASSOCIATED.\nThis was necessary because workqueue\u0027s CPU_DOWN_PREPARE happened\nbefore other DOWN_PREPARE notifiers and workqueue needed to stay\nassociated across the rest of DOWN_PREPARE.\n\nAfter the previous patch, workqueue\u0027s DOWN_PREPARE happens after\nothers and can set GCWQ_DISASSOCIATED directly.  Drop CPU_DYING and\nlet the trustee set GCWQ_DISASSOCIATED after disabling concurrency\nmanagement.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nAcked-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\n"
    },
    {
      "commit": "6575820221f7a4dd6eadecf7bf83cdd154335eda",
      "tree": "2f9061b4eb1b6cf5a4b70acc45cb46a1a287066a",
      "parents": [
        "3270476a6c0ce322354df8679652f060d66526dc"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:26 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 17 12:39:26 2012 -0700"
      },
      "message": "workqueue: perform cpu down operations from low priority cpu_notifier()\n\nCurrently, all workqueue cpu hotplug operations run off\nCPU_PRI_WORKQUEUE which is higher than normal notifiers.  This is to\nensure that workqueue is up and running while bringing up a CPU before\nother notifiers try to use workqueue on the CPU.\n\nPer-cpu workqueues are supposed to remain working and bound to the CPU\nfor normal CPU_DOWN_PREPARE notifiers.  This holds mostly true even\nwith workqueue offlining running with higher priority because\nworkqueue CPU_DOWN_PREPARE only creates a bound trustee thread which\nruns the per-cpu workqueue without concurrency management without\nexplicitly detaching the existing workers.\n\nHowever, if the trustee needs to create new workers, it creates\nunbound workers which may wander off to other CPUs while\nCPU_DOWN_PREPARE notifiers are in progress.  Furthermore, if the CPU\ndown is cancelled, the per-CPU workqueue may end up with workers which\naren\u0027t bound to the CPU.\n\nWhile reliably reproducible with a convoluted artificial test-case\ninvolving scheduling and flushing CPU burning work items from CPU down\nnotifiers, this isn\u0027t very likely to happen in the wild, and, even\nwhen it happens, the effects are likely to be hidden by the following\nsuccessful CPU down.\n\nFix it by using different priorities for up and down notifiers - high\npriority for up operations and low priority for down operations.\n\nWorkqueue cpu hotplug operations will soon go through further cleanup.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: stable@vger.kernel.org\nAcked-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\n"
    },
    {
      "commit": "3270476a6c0ce322354df8679652f060d66526dc",
      "tree": "db58846beb7c5e1c1b50b7e2f1c2538320408c26",
      "parents": [
        "4ce62e9e30cacc26885cab133ad1de358dd79f21"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 13 22:16:45 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 13 22:24:45 2012 -0700"
      },
      "message": "workqueue: reimplement WQ_HIGHPRI using a separate worker_pool\n\nWQ_HIGHPRI was implemented by queueing highpri work items at the head\nof the global worklist.  Other than queueing at the head, they weren\u0027t\nhandled differently; unfortunately, this could lead to execution\nlatency of a few seconds on heavily loaded systems.\n\nNow that workqueue code has been updated to deal with multiple\nworker_pools per global_cwq, this patch reimplements WQ_HIGHPRI using\na separate worker_pool.  NR_WORKER_POOLS is bumped to two and\ngcwq-\u003epools[0] is used for normal pri work items and -\u003epools[1] for\nhighpri.  Highpri workers get -20 nice level and has \u0027H\u0027 suffix in\ntheir names.  Note that this change increases the number of kworkers\nper cpu.\n\nPOOL_HIGHPRI_PENDING, pool_determine_ins_pos() and highpri chain\nwakeup code in process_one_work() are no longer used and removed.\n\nThis allows proper prioritization of highpri work items and removes\nhigh execution latency of highpri work items.\n\nv2: nr_running indexing bug in get_pool_nr_running() fixed.\n\nv3: Refreshed for the get_pool_nr_running() update in the previous\n    patch.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: Josh Hunt \u003cjoshhunt00@gmail.com\u003e\nLKML-Reference: \u003cCAKA\u003dqzaHqwZ8eqpLNFjxnO2fX-tgAOjmpvxgBFjv6dJeQaOW1w@mail.gmail.com\u003e\nCc: Tony Luck \u003ctony.luck@intel.com\u003e\nCc: Fengguang Wu \u003cfengguang.wu@intel.com\u003e\n"
    },
    {
      "commit": "4ce62e9e30cacc26885cab133ad1de358dd79f21",
      "tree": "6b08a377a236f0e44f335f7813d3da58a7ee1c70",
      "parents": [
        "11ebea50dbc1ade5994b2c838a096078d4c02399"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 13 22:16:44 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 13 22:16:44 2012 -0700"
      },
      "message": "workqueue: introduce NR_WORKER_POOLS and for_each_worker_pool()\n\nIntroduce NR_WORKER_POOLS and for_each_worker_pool() and convert code\npaths which need to manipulate all pools in a gcwq to use them.\nNR_WORKER_POOLS is currently one and for_each_worker_pool() iterates\nover only @gcwq-\u003epool.\n\nNote that nr_running is per-pool property and converted to an array\nwith NR_WORKER_POOLS elements and renamed to pool_nr_running.  Note\nthat get_pool_nr_running() currently assumes 0 index.  The next patch\nwill make use of non-zero index.\n\nThe changes in this patch are mechanical and don\u0027t caues any\nfunctional difference.  This is to prepare for multiple pools per\ngcwq.\n\nv2: nr_running indexing bug in get_pool_nr_running() fixed.\n\nv3: Pointer to array is stupid.  Don\u0027t use it in get_pool_nr_running()\n    as suggested by Linus.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Tony Luck \u003ctony.luck@intel.com\u003e\nCc: Fengguang Wu \u003cfengguang.wu@intel.com\u003e\nCc: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "11ebea50dbc1ade5994b2c838a096078d4c02399",
      "tree": "c0553ac78d52512ee1c2dfe65049554898dd6638",
      "parents": [
        "63d95a9150ee3bbd4117fcd609dee40313b454d9"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Jul 12 14:46:37 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Jul 12 14:46:37 2012 -0700"
      },
      "message": "workqueue: separate out worker_pool flags\n\nGCWQ_MANAGE_WORKERS, GCWQ_MANAGING_WORKERS and GCWQ_HIGHPRI_PENDING\nare per-pool properties.  Add worker_pool-\u003eflags and make the above\nthree flags per-pool flags.\n\nThe changes in this patch are mechanical and don\u0027t caues any\nfunctional difference.  This is to prepare for multiple pools per\ngcwq.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "63d95a9150ee3bbd4117fcd609dee40313b454d9",
      "tree": "0833d49afe4478586d791217772dcdef974f662f",
      "parents": [
        "bd7bdd43dcb81bb08240b9401b36a104f77dc135"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Jul 12 14:46:37 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Jul 12 14:46:37 2012 -0700"
      },
      "message": "workqueue: use @pool instead of @gcwq or @cpu where applicable\n\nModify all functions which deal with per-pool properties to pass\naround @pool instead of @gcwq or @cpu.\n\nThe changes in this patch are mechanical and don\u0027t caues any\nfunctional difference.  This is to prepare for multiple pools per\ngcwq.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "bd7bdd43dcb81bb08240b9401b36a104f77dc135",
      "tree": "4d12a15e7e72f2d64fb6e58a145e56b4da1a341a",
      "parents": [
        "974271c485a4d8bb801decc616748f90aafb07ec"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Jul 12 14:46:37 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Jul 12 14:46:37 2012 -0700"
      },
      "message": "workqueue: factor out worker_pool from global_cwq\n\nMove worklist and all worker management fields from global_cwq into\nthe new struct worker_pool.  worker_pool points back to the containing\ngcwq.  worker and cpu_workqueue_struct are updated to point to\nworker_pool instead of gcwq too.\n\nThis change is mechanical and doesn\u0027t introduce any functional\ndifference other than rearranging of fields and an added level of\nindirection in some places.  This is to prepare for multiple pools per\ngcwq.\n\nv2: Comment typo fixes as suggested by Namhyung.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Namhyung Kim \u003cnamhyung@kernel.org\u003e\n"
    },
    {
      "commit": "974271c485a4d8bb801decc616748f90aafb07ec",
      "tree": "ed3e41b86293b207127a03bde638e4dd6acf6d58",
      "parents": [
        "918227bb1b59444a2c467711fd50cc22bb4a897b"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Jul 12 14:46:37 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Jul 12 14:46:37 2012 -0700"
      },
      "message": "workqueue: don\u0027t use WQ_HIGHPRI for unbound workqueues\n\nUnbound wqs aren\u0027t concurrency-managed and try to execute work items\nas soon as possible.  This is currently achieved by implicitly setting\n%WQ_HIGHPRI on all unbound workqueues; however, WQ_HIGHPRI\nimplementation is about to be restructured and this usage won\u0027t be\nvalid anymore.\n\nAdd an explicit chain-wakeup path for unbound workqueues in\nprocess_one_work() instead of piggy backing on %WQ_HIGHPRI.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "4d82a1debbffec129cc387aafa8f40b7bbab3297",
      "tree": "64e7bc03962b99fa9b8c4cdb603d1784185a2a20",
      "parents": [
        "544ecf310f0e7f51fa057ac2a295fc1b3b35a9d3"
      ],
      "author": {
        "name": "Peter Zijlstra",
        "email": "peterz@infradead.org",
        "time": "Tue May 15 08:06:19 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue May 15 08:08:31 2012 -0700"
      },
      "message": "lockdep: fix oops in processing workqueue\n\nUnder memory load, on x86_64, with lockdep enabled, the workqueue\u0027s\nprocess_one_work() has been seen to oops in __lock_acquire(), barfing\non a 0xffffffff00000000 pointer in the lockdep_map\u0027s class_cache[].\n\nBecause it\u0027s permissible to free a work_struct from its callout function,\nthe map used is an onstack copy of the map given in the work_struct: and\nthat copy is made without any locking.\n\nSurprisingly, gcc (4.5.1 in Hugh\u0027s case) uses \"rep movsl\" rather than\n\"rep movsq\" for that structure copy: which might race with a workqueue\nuser\u0027s wait_on_work() doing lock_map_acquire() on the source of the\ncopy, putting a pointer into the class_cache[], but only in time for\nthe top half of that pointer to be copied to the destination map.\n\nBoom when process_one_work() subsequently does lock_map_acquire()\non its onstack copy of the lockdep_map.\n\nFix this, and a similar instance in call_timer_fn(), with a\nlockdep_copy_map() function which additionally NULLs the class_cache[].\n\nNote: this oops was actually seen on 3.4-next, where flush_work() newly\ndoes the racing lock_map_acquire(); but Tejun points out that 3.4 and\nearlier are already vulnerable to the same through wait_on_work().\n\n* Patch orginally from Peter.  Hugh modified it a bit and wrote the\n  description.\n\nSigned-off-by: Peter Zijlstra \u003cpeterz@infradead.org\u003e\nReported-by: Hugh Dickins \u003chughd@google.com\u003e\nLKML-Reference: \u003calpine.LSU.2.00.1205070951170.1544@eggly.anvils\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "544ecf310f0e7f51fa057ac2a295fc1b3b35a9d3",
      "tree": "417e606b3a1a7eaa31a3847a5101db37041e0c20",
      "parents": [
        "0976dfc1d0cd80a4e9dfaf87bd8744612bde475a"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon May 14 15:04:50 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon May 14 15:04:50 2012 -0700"
      },
      "message": "workqueue: skip nr_running sanity check in worker_enter_idle() if trustee is active\n\nworker_enter_idle() has WARN_ON_ONCE() which triggers if nr_running\nisn\u0027t zero when every worker is idle.  This can trigger spuriously\nwhile a cpu is going down due to the way trustee sets %WORKER_ROGUE\nand zaps nr_running.\n\nIt first sets %WORKER_ROGUE on all workers without updating\nnr_running, releases gcwq-\u003elock, schedules, regrabs gcwq-\u003elock and\nthen zaps nr_running.  If the last running worker enters idle\ninbetween, it would see stale nr_running which hasn\u0027t been zapped yet\nand trigger the WARN_ON_ONCE().\n\nFix it by performing the sanity check iff the trustee is idle.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: \"Paul E. McKenney\" \u003cpaulmck@linux.vnet.ibm.com\u003e\nCc: stable@vger.kernel.org\n"
    },
    {
      "commit": "0976dfc1d0cd80a4e9dfaf87bd8744612bde475a",
      "tree": "0af2d79070fcb0a510187eb780db796c5702df20",
      "parents": [
        "f5b2552b4ebbeadcadde1532d7bbd3f850719046"
      ],
      "author": {
        "name": "Stephen Boyd",
        "email": "sboyd@codeaurora.org",
        "time": "Fri Apr 20 17:28:50 2012 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Apr 23 11:06:42 2012 -0700"
      },
      "message": "workqueue: Catch more locking problems with flush_work()\n\nIf a workqueue is flushed with flush_work() lockdep checking can\nbe circumvented. For example:\n\n static DEFINE_MUTEX(mutex);\n\n static void my_work(struct work_struct *w)\n {\n         mutex_lock(\u0026mutex);\n         mutex_unlock(\u0026mutex);\n }\n\n static DECLARE_WORK(work, my_work);\n\n static int __init start_test_module(void)\n {\n         schedule_work(\u0026work);\n         return 0;\n }\n module_init(start_test_module);\n\n static void __exit stop_test_module(void)\n {\n         mutex_lock(\u0026mutex);\n         flush_work(\u0026work);\n         mutex_unlock(\u0026mutex);\n }\n module_exit(stop_test_module);\n\nwould not always print a warning when flush_work() was called.\nIn this trivial example nothing could go wrong since we are\nguaranteed module_init() and module_exit() don\u0027t run concurrently,\nbut if the work item is schedule asynchronously we could have a\nscenario where the work item is running just at the time flush_work()\nis called resulting in a classic ABBA locking problem.\n\nAdd a lockdep hint by acquiring and releasing the work item\nlockdep_map in flush_work() so that we always catch this\npotential deadlock scenario.\n\nSigned-off-by: Stephen Boyd \u003csboyd@codeaurora.org\u003e\nReviewed-by: Yong Zhang \u003cyong.zhang0@gmail.com\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "f5b2552b4ebbeadcadde1532d7bbd3f850719046",
      "tree": "89bbf52668883f0a4c65ed10bd113a5cc4d75721",
      "parents": [
        "d3283fb45c06dfd7b1a36da8e6ff39d313f0600c"
      ],
      "author": {
        "name": "Dan Carpenter",
        "email": "dan.carpenter@oracle.com",
        "time": "Fri Apr 13 22:06:58 2012 +0300"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Apr 16 14:54:59 2012 -0700"
      },
      "message": "workqueue: change BUG_ON() to WARN_ON()\n\nThis BUG_ON() can be triggered if you call schedule_work() before\ncalling INIT_WORK().  It is a bug definitely, but it\u0027s nicer to just\nprint a stack trace and return.\n\nReported-by: Matt Renzelmann \u003cmjr@cs.wisc.edu\u003e\nSigned-off-by: Dan Carpenter \u003cdan.carpenter@oracle.com\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "e45836fafe157df137a837093037f741ad8f4c90",
      "tree": "cba5fdef1fd2e70f3610c78dbcb56ebd1be67654",
      "parents": [
        "0d9cabdccedb79ee5f27b77ff51f29a9e7d23275",
        "e06ffa1ede4146cbc261d90f5dff3d63fe2e9d7a"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Mar 20 18:13:22 2012 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Mar 20 18:13:22 2012 -0700"
      },
      "message": "Merge branch \u0027for-3.4\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq\n\nPull workqueue changes from Tejun Heo:\n \"This contains only one commit which cleans up UP allocation path a\n  bit.\"\n\n* \u0027for-3.4\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq:\n  workqueue: use percpu allocator for cwq on UP\n"
    },
    {
      "commit": "e06ffa1ede4146cbc261d90f5dff3d63fe2e9d7a",
      "tree": "3d8a7bccc95926aeb08c1b03e1ea8cffe722d38c",
      "parents": [
        "fde7d9049e55ab85a390be7f415d74c9f62dd0f9"
      ],
      "author": {
        "name": "Lai Jiangshan",
        "email": "laijs@cn.fujitsu.com",
        "time": "Fri Mar 09 18:03:20 2012 +0800"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Mar 12 09:21:17 2012 -0700"
      },
      "message": "workqueue: use percpu allocator for cwq on UP\n\nI notice that the commit bbddff makes percpu allocator can work on UP,\nSo we don\u0027t need the magic way for UP.\n\nSigned-off-by: Lai Jiangshan \u003claijs@cn.fujitsu.com\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "62d3c5439c534b0e6c653fc63e6d8c67be3a57b1",
      "tree": "d335d0e449ef2d61d52921e3f210cdd403bb025a",
      "parents": [
        "cecd353a02fb1405c8a72a324b26b5acf97e7411"
      ],
      "author": {
        "name": "Alan Stern",
        "email": "stern@rowland.harvard.edu",
        "time": "Fri Mar 02 10:51:00 2012 +0100"
      },
      "committer": {
        "name": "Jens Axboe",
        "email": "axboe@kernel.dk",
        "time": "Fri Mar 02 10:51:00 2012 +0100"
      },
      "message": "Block: use a freezable workqueue for disk-event polling\n\nThis patch (as1519) fixes a bug in the block layer\u0027s disk-events\npolling.  The polling is done by a work routine queued on the\nsystem_nrt_wq workqueue.  Since that workqueue isn\u0027t freezable, the\npolling continues even in the middle of a system sleep transition.\n\nObviously, polling a suspended drive for media changes and such isn\u0027t\na good thing to do; in the case of USB mass-storage devices it can\nlead to real problems requiring device resets and even re-enumeration.\n\nThe patch fixes things by creating a new system-wide, non-reentrant,\nfreezable workqueue and using it for disk-events polling.\n\nSigned-off-by: Alan Stern \u003cstern@rowland.harvard.edu\u003e\nCC: \u003cstable@kernel.org\u003e\nAcked-by: Tejun Heo \u003ctj@kernel.org\u003e\nAcked-by: Rafael J. Wysocki \u003crjw@sisk.pl\u003e\nSigned-off-by: Jens Axboe \u003caxboe@kernel.dk\u003e\n"
    },
    {
      "commit": "b196be89cdc14a88cc637cdad845a75c5886c82d",
      "tree": "195816e6ab82362969409b3317d223421502224a",
      "parents": [
        "0499680a42141d86417a8fbaa8c8db806bea1201"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jan 10 15:11:35 2012 -0800"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Jan 10 16:30:54 2012 -0800"
      },
      "message": "workqueue: make alloc_workqueue() take printf fmt and args for name\n\nalloc_workqueue() currently expects the passed in @name pointer to remain\naccessible.  This is inconvenient and a bit silly given that the whole wq\nis being dynamically allocated.  This patch updates alloc_workqueue() and\nfriends to take printf format string instead of opaque string and matching\nvarargs at the end.  The name is allocated together with the wq and\nformatted.\n\nalloc_ordered_workqueue() is converted to a macro to unify varargs\nhandling with alloc_workqueue(), and, while at it, add comment to\nalloc_workqueue().\n\nNone of the current in-kernel users pass in string with \u0027%\u0027 as constant\nname and this change shouldn\u0027t cause any problem.\n\n[akpm@linux-foundation.org: use __printf]\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nSuggested-by: Christoph Hellwig \u003chch@infradead.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "9984de1a5a8a96275fcab818f7419af5a3c86e71",
      "tree": "1935d411752707a1621c5caf64f75dfe105beb3a",
      "parents": [
        "7c77509c542927ee2a3c8812fad84957e51bf67d"
      ],
      "author": {
        "name": "Paul Gortmaker",
        "email": "paul.gortmaker@windriver.com",
        "time": "Mon May 23 14:51:41 2011 -0400"
      },
      "committer": {
        "name": "Paul Gortmaker",
        "email": "paul.gortmaker@windriver.com",
        "time": "Mon Oct 31 09:20:12 2011 -0400"
      },
      "message": "kernel: Map most files to use export.h instead of module.h\n\nThe changed files were only including linux/module.h for the\nEXPORT_SYMBOL infrastructure, and nothing else.  Revector them\nonto the isolated export header for faster compile times.\n\nNothing to see here but a whole lot of instances of:\n\n  -#include \u003clinux/module.h\u003e\n  +#include \u003clinux/export.h\u003e\n\nThis commit is only changing the kernel dir; next targets\nwill probably be mm, fs, the arch dirs, etc.\n\nSigned-off-by: Paul Gortmaker \u003cpaul.gortmaker@windriver.com\u003e\n"
    },
    {
      "commit": "fa2563e41c3d6d6e8af437643981ed28ae0cb56d",
      "tree": "7d0dbcc4214a3bceb4d1dd9251df88752c1313b5",
      "parents": [
        "df4e33ad249b7480d6ba5dd11fc1dac5cfaffce1"
      ],
      "author": {
        "name": "Thomas Tuttle",
        "email": "ttuttle@chromium.org",
        "time": "Wed Sep 14 16:22:28 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Sep 14 18:09:38 2011 -0700"
      },
      "message": "workqueue: lock cwq access in drain_workqueue\n\nTake cwq-\u003egcwq-\u003elock to avoid racing between drain_workqueue checking to\nmake sure the workqueues are empty and cwq_dec_nr_in_flight decrementing\nand then incrementing nr_active when it activates a delayed work.\n\nWe discovered this when a corner case in one of our drivers resulted in\nus trying to destroy a workqueue in which the remaining work would\nalways requeue itself again in the same workqueue.  We would hit this\nrace condition and trip the BUG_ON on workqueue.c:3080.\n\nSigned-off-by: Thomas Tuttle \u003cttuttle@chromium.org\u003e\nAcked-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: \u003cstable@kernel.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "5a791ea4fa4495f7136679cb5366f6544148e613",
      "tree": "dc27644add7d5f1165db19c28c25ae842e5f96b2",
      "parents": [
        "8209f53d79444747782a28520187abaf689761f2",
        "9c5a2ba70251ecaab18c7a83e38b3c620223476c"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri Jul 22 15:07:15 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Fri Jul 22 15:07:15 2011 -0700"
      },
      "message": "Merge branch \u0027for-3.1\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq\n\n* \u0027for-3.1\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq:\n  workqueue: separate out drain_workqueue() from destroy_workqueue()\n  workqueue: remove cancel_rearming_delayed_work[queue]()\n"
    },
    {
      "commit": "5129df03d0c44b2d5a5f9d7d52f3b079706b9a8f",
      "tree": "799e309a7db032cb7abe9f0fa910c2989c3fdab5",
      "parents": [
        "4d429480352c63db2228489f0db9fd381cdc3c9c",
        "6988f20fe04e9ef3aea488cb8ab57fbeb78e12f0"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue May 24 11:53:42 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue May 24 11:53:42 2011 -0700"
      },
      "message": "Merge branch \u0027for-2.6.40\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu\n\n* \u0027for-2.6.40\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu:\n  percpu: Unify input section names\n  percpu: Avoid extra NOP in percpu_cmpxchg16b_double\n  percpu: Cast away printk format warning\n  percpu: Always align percpu output section to PAGE_SIZE\n\nFix up fairly trivial conflict in arch/x86/include/asm/percpu.h as per Tejun\n"
    },
    {
      "commit": "9c5a2ba70251ecaab18c7a83e38b3c620223476c",
      "tree": "ece2c035b761af1332ea027f32443a6d05b16bc9",
      "parents": [
        "2543a87108d2af7d48a43b3d6685c2b1ea279e36"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Apr 05 18:01:44 2011 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri May 20 13:54:46 2011 +0200"
      },
      "message": "workqueue: separate out drain_workqueue() from destroy_workqueue()\n\nThere are users which want to drain workqueues without destroying it.\nSeparate out drain functionality from destroy_workqueue() into\ndrain_workqueue() and make it accessible to workqueue users.\n\nTo guarantee forward-progress, only chain queueing is allowed while\ndrain is in progress.  If a new work item which isn\u0027t chained from the\nrunning or pending work items is queued while draining is in progress,\nWARN_ON_ONCE() is triggered.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: James Bottomley \u003cJames.Bottomley@hansenpartnership.com\u003e\n"
    },
    {
      "commit": "5035b20fa5cd146b66f5f89619c20a4177fb736d",
      "tree": "cd62bba3a3c36164d0faaac1b3c922be0eca11f1",
      "parents": [
        "e2de9e0862778f4aba103027ce575efbddb8117f"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Apr 29 18:08:37 2011 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Apr 29 18:08:37 2011 +0200"
      },
      "message": "workqueue: fix deadlock in worker_maybe_bind_and_lock()\n\nIf a rescuer and stop_machine() bringing down a CPU race with each\nother, they may deadlock on non-preemptive kernel.  The CPU won\u0027t\naccept a new task, so the rescuer can\u0027t migrate to the target CPU,\nwhile stop_machine() can\u0027t proceed because the rescuer is holding one\nof the CPU retrying migration.  GCWQ_DISASSOCIATED is never cleared\nand worker_maybe_bind_and_lock() retries indefinitely.\n\nThis problem can be reproduced semi reliably while the system is\nentering suspend.\n\n http://thread.gmane.org/gmane.linux.kernel/1122051\n\nA lot of kudos to Thilo-Alexander for reporting this tricky issue and\npainstaking testing.\n\nstable: This affects all kernels with cmwq, so all kernels since and\n        including v2.6.36 need this fix.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: Thilo-Alexander Ginkel \u003cthilo@ginkel.com\u003e\nTested-by: Thilo-Alexander Ginkel \u003cthilo@ginkel.com\u003e\nCc: stable@kernel.org\n"
    },
    {
      "commit": "0415b00d175e0d8945e6785aad21b5f157976ce0",
      "tree": "cf6f9286a47a22bf57766a3f17eaf4190bc9c242",
      "parents": [
        "6c5103890057b1bb781b26b7aae38d33e4c517d8"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Mar 24 18:50:09 2011 +0100"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Mar 24 18:50:09 2011 +0100"
      },
      "message": "percpu: Always align percpu output section to PAGE_SIZE\n\nPercpu allocator honors alignment request upto PAGE_SIZE and both the\npercpu addresses in the percpu address space and the translated kernel\naddresses should be aligned accordingly.  The calculation of the\nformer depends on the alignment of percpu output section in the kernel\nimage.\n\nThe linker script macros PERCPU_VADDR() and PERCPU() are used to\ndefine this output section and the latter takes @align parameter.\nSeveral architectures are using @align smaller than PAGE_SIZE breaking\npercpu memory alignment.\n\nThis patch removes @align parameter from PERCPU(), renames it to\nPERCPU_SECTION() and makes it always align to PAGE_SIZE.  While at it,\nadd PCPU_SETUP_BUG_ON() checks such that alignment problems are\nreliably detected and remove percpu alignment comment recently added\nin workqueue.c as the condition would trigger BUG way before reaching\nthere.\n\nFor um, this patch raises the alignment of percpu area.  As the area\nis in .init, there shouldn\u0027t be any noticeable difference.\n\nThis problem was discovered by David Howells while debugging boot\nfailure on mn10300.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nAcked-by: Mike Frysinger \u003cvapier@gentoo.org\u003e\nCc: uclinux-dist-devel@blackfin.uclinux.org\nCc: David Howells \u003cdhowells@redhat.com\u003e\nCc: Jeff Dike \u003cjdike@addtoit.com\u003e\nCc: user-mode-linux-devel@lists.sourceforge.net\n"
    },
    {
      "commit": "94dcf29a11b3d20a28790598d701f98484a969da",
      "tree": "21c65f6634dcde739bb85cbc019ee273f1427f90",
      "parents": [
        "207205a2ba2655652fe46a60b49838af6c16a919"
      ],
      "author": {
        "name": "Eric Dumazet",
        "email": "eric.dumazet@gmail.com",
        "time": "Tue Mar 22 16:30:45 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Mar 22 17:44:01 2011 -0700"
      },
      "message": "kthread: use kthread_create_on_node()\n\nksoftirqd, kworker, migration, and pktgend kthreads can be created with\nkthread_create_on_node(), to get proper NUMA affinities for their stack and\ntask_struct.\n\nSigned-off-by: Eric Dumazet \u003ceric.dumazet@gmail.com\u003e\nAcked-by: David S. Miller \u003cdavem@davemloft.net\u003e\nReviewed-by: Andi Kleen \u003cak@linux.intel.com\u003e\nAcked-by: Rusty Russell \u003crusty@rustcorp.com.au\u003e\nAcked-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Tony Luck \u003ctony.luck@intel.com\u003e\nCc: Fenghua Yu \u003cfenghua.yu@intel.com\u003e\nCc: David Howells \u003cdhowells@redhat.com\u003e\nCc: \u003clinux-arch@vger.kernel.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "bd2895eeade5f11f3e5906283c630bbdb4b57454",
      "tree": "4d98f4fcd80c7d062afce28823d08aee53e66f82",
      "parents": [
        "016aa2ed1cc9cf704cf76d8df07751b6daa9750f",
        "24d51add7438f9696a7205927bf9de3c5c787a58"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Mar 16 08:20:19 2011 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Wed Mar 16 08:20:19 2011 -0700"
      },
      "message": "Merge branch \u0027for-2.6.39\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq\n\n* \u0027for-2.6.39\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq:\n  workqueue: fix build failure introduced by s/freezeable/freezable/\n  workqueue: add system_freezeable_wq\n  rds/ib: use system_wq instead of rds_ib_fmr_wq\n  net/9p: replace p9_poll_task with a work\n  net/9p: use system_wq instead of p9_mux_wq\n  xfs: convert to alloc_workqueue()\n  reiserfs: make commit_wq use the default concurrency level\n  ocfs2: use system_wq instead of ocfs2_quota_wq\n  ext4: convert to alloc_workqueue()\n  scsi/scsi_tgt_lib: scsi_tgtd isn\u0027t used in memory reclaim path\n  scsi/be2iscsi,qla2xxx: convert to alloc_workqueue()\n  misc/iwmc3200top: use system_wq instead of dedicated workqueues\n  i2o: use alloc_workqueue() instead of create_workqueue()\n  acpi: kacpi*_wq don\u0027t need WQ_MEM_RECLAIM\n  fs/aio: aio_wq isn\u0027t used in memory reclaim path\n  input/tps6507x-ts: use system_wq instead of dedicated workqueue\n  cpufreq: use system_wq instead of dedicated workqueues\n  wireless/ipw2x00: use system_wq instead of dedicated workqueues\n  arm/omap: use system_wq in mailbox\n  workqueue: use WQ_MEM_RECLAIM instead of WQ_RESCUER\n"
    },
    {
      "commit": "997772884036e6e121de39322179989154437d9f",
      "tree": "618ef63c45e16892ea26a99cafef6b0442e8eca1",
      "parents": [
        "a5abba989deceb731047425812d268daf7536575"
      ],
      "author": {
        "name": "Stanislaw Gruszka",
        "email": "sgruszka@redhat.com",
        "time": "Mon Mar 07 09:58:33 2011 +0100"
      },
      "committer": {
        "name": "Thomas Gleixner",
        "email": "tglx@linutronix.de",
        "time": "Tue Mar 08 16:10:38 2011 +0100"
      },
      "message": "debugobjects: Add hint for better object identification\n\nIn complex subsystems like mac80211 structures can contain several\ntimers and work structs, so identifying a specific instance from the\ncall trace and object type output of debugobjects can be hard.\n\nAllow the subsystems which support debugobjects to provide a hint\nfunction. This function returns a pointer to a kernel address\n(preferrably the objects callback function) which is printed along\nwith the debugobjects type.\n\nAdd hint methods for timer_list, work_struct and hrtimer.\n\n[ tglx: Massaged changelog, made it compile ]\n\nSigned-off-by: Stanislaw Gruszka \u003csgruszka@redhat.com\u003e\nLKML-Reference: \u003c20110307085809.GA9334@redhat.com\u003e\nSigned-off-by: Thomas Gleixner \u003ctglx@linutronix.de\u003e\n"
    },
    {
      "commit": "24d51add7438f9696a7205927bf9de3c5c787a58",
      "tree": "133c4470edc09e70de6bc5b7910d43745801f469",
      "parents": [
        "43d133c18b44e7d82d82ef0dcc2bddd55d5dfe81"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Feb 21 09:52:50 2011 +0100"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Feb 21 10:07:23 2011 +0100"
      },
      "message": "workqueue: fix build failure introduced by s/freezeable/freezable/\n\nwq:fixes-2.6.38 does s/WQ_FREEZEABLE/WQ_FREEZABLE and wq:for-2.6.39\nadds new usage of the flag.  The combination of the two creates a\nbuild failure after merge.  Fix it by renaming all freezeables to\nfreezables.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: Stephen Rothwell \u003csfr@canb.auug.org.au\u003e\n"
    },
    {
      "commit": "43d133c18b44e7d82d82ef0dcc2bddd55d5dfe81",
      "tree": "8de75c837b55874cc8a81a29bdedbc62668d4481",
      "parents": [
        "4149efb22da66e326fc48baf80d628834509f7f0",
        "6f576d57f1fa0d6026b495d8746d56d949989161"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Feb 21 09:43:56 2011 +0100"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Feb 21 09:43:56 2011 +0100"
      },
      "message": "Merge branch \u0027master\u0027 into for-2.6.39\n"
    },
    {
      "commit": "3233cdbd9fa347a6d6897a94cc6ed0302ae83c4f",
      "tree": "053948a81cb40a37d3afbd0f6ca8f3a106523c73",
      "parents": [
        "58a69cb47ec6991bf006a3e5d202e8571b0327a4"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Wed Feb 16 18:10:19 2011 +0100"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Wed Feb 16 18:10:19 2011 +0100"
      },
      "message": "workqueue: make sure MAYDAY_INITIAL_TIMEOUT is at least 2 jiffies long\n\nMAYDAY_INITIAL_TIMEOUT is defined as HZ / 100 and depending on\nconfiguration may end up 0 or 1.  Even when it\u0027s 1, depending on when\nthe mayday timer is added in the current jiffy interval, it may expire\nway before a jiffy has passed.\n\nMake sure MAYDAY_INITIAL_TIMEOUT is at least two to guarantee that at\nleast a full jiffy has passed before calling rescuers.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: Ray Jui \u003crjui@broadcom.com\u003e\nCc: stable@kernel.org\n"
    },
    {
      "commit": "58a69cb47ec6991bf006a3e5d202e8571b0327a4",
      "tree": "56abdf817649c352f70bff3263f9351ed6c42062",
      "parents": [
        "7576958a9d5a4a677ad7dd40901cdbb6c1110c98"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Wed Feb 16 09:25:31 2011 +0100"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Wed Feb 16 17:48:59 2011 +0100"
      },
      "message": "workqueue, freezer: unify spelling of \u0027freeze\u0027 + \u0027able\u0027 to \u0027freezable\u0027\n\nThere are two spellings in use for \u0027freeze\u0027 + \u0027able\u0027 - \u0027freezable\u0027 and\n\u0027freezeable\u0027.  The former is the more prominent one.  The latter is\nmostly used by workqueue and in a few other odd places.  Unify the\nspelling to \u0027freezable\u0027.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: Alan Stern \u003cstern@rowland.harvard.edu\u003e\nAcked-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\nAcked-by: Greg Kroah-Hartman \u003cgregkh@suse.de\u003e\nAcked-by: Dmitry Torokhov \u003cdtor@mail.ru\u003e\nCc: David Woodhouse \u003cdwmw2@infradead.org\u003e\nCc: Alex Dubov \u003coakad@yahoo.com\u003e\nCc: \"David S. Miller\" \u003cdavem@davemloft.net\u003e\nCc: Steven Whitehouse \u003cswhiteho@redhat.com\u003e\n"
    },
    {
      "commit": "7576958a9d5a4a677ad7dd40901cdbb6c1110c98",
      "tree": "db0b180feebf3a4ca6cd3155764cfc61a6d7f3cf",
      "parents": [
        "795abaf1e4e188c4171e3cd3dbb11a9fcacaf505"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Feb 14 14:04:46 2011 +0100"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Feb 14 14:04:46 2011 +0100"
      },
      "message": "workqueue: wake up a worker when a rescuer is leaving a gcwq\n\nAfter executing the matching works, a rescuer leaves the gcwq whether\nthere are more pending works or not.  This may decrease the\nconcurrency level to zero and stall execution until a new work item is\nqueued on the gcwq.\n\nMake rescuer wake up a regular worker when it leaves a gcwq if there\nare more works to execute, so that execution isn\u0027t stalled.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: Ray Jui \u003crjui@broadcom.com\u003e\nCc: stable@kernel.org\n"
    },
    {
      "commit": "4149efb22da66e326fc48baf80d628834509f7f0",
      "tree": "f55c97e3678eaff010a36b97bcde0e9d2294ccb4",
      "parents": [
        "c534a107e8fe446202b0fab102abc015c56c0317"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Feb 08 10:39:03 2011 +0100"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Wed Feb 09 09:37:49 2011 +0100"
      },
      "message": "workqueue: add system_freezeable_wq\n\nAdd system wide freezeable workqueue.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nAcked-by: Dmitry Torokhov \u003cdmitry.torokhov@gmail.com\u003e\nCc: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\n"
    },
    {
      "commit": "42c025f3de9042d9c9abd9a6f6205d1a0f4bcadf",
      "tree": "67c618a227059548e2be915560aa113f590e6d5e",
      "parents": [
        "e159489baa717dbae70f9903770a6a4990865887"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jan 11 15:58:49 2011 +0100"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jan 11 16:03:14 2011 +0100"
      },
      "message": "workqueue: note the nested NOT_RUNNING test in worker_clr_flags() isn\u0027t a noop\n\nThe nested NOT_RUNNING test in worker_clr_flags() is slightly\nmisleading in that if NOT_RUNNING were a single flag the nested test\nwould be always %true and thus noop.  Add a comment noting that the\ntest isn\u0027t a noop.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Hillf Danton \u003cdhillf@gmail.com\u003e\nCc: Andrew Morton \u003cakpm@linux-foundation.org\u003e\n"
    },
    {
      "commit": "e159489baa717dbae70f9903770a6a4990865887",
      "tree": "6e2ae803ff6ebed558ebbe03bf3ae5bda1dd6ebc",
      "parents": [
        "0c21e3aaf6ae85bee804a325aa29c325209180fd"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Sun Jan 09 23:32:15 2011 +0100"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jan 11 15:33:01 2011 +0100"
      },
      "message": "workqueue: relax lockdep annotation on flush_work()\n\nCurrently, the lockdep annotation in flush_work() requires exclusive\naccess on the workqueue the target work is queued on and triggers\nwarning if a work is trying to flush another work on the same\nworkqueue; however, this is no longer true as workqueues can now\nexecute multiple works concurrently.\n\nThis patch adds lock_map_acquire_read() and make process_one_work()\nhold read access to the workqueue while executing a work and\nstart_flush_work() check for write access if concurrnecy level is one\nor the workqueue has a rescuer (as only one execution resource - the\nrescuer - is guaranteed to be available under memory pressure), and\nread access if higher.\n\nThis better represents what\u0027s going on and removes spurious lockdep\nwarnings which are triggered by fake dependency chain created through\nflush_work().\n\n* Peter pointed out that flushing another work from a WQ_MEM_RECLAIM\n  wq breaks forward progress guarantee under memory pressure.\n  Condition check accordingly updated.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\nTested-by: \"Rafael J. Wysocki\" \u003crjw@sisk.pl\u003e\nCc: Peter Zijlstra \u003cpeterz@infradead.org\u003e\nCc: stable@kernel.org\n"
    },
    {
      "commit": "c8efcc2589464ac70255bb83e10cad61c7c6d295",
      "tree": "a7f9c975831344ba78d3a2f9d252749d0479ca2b",
      "parents": [
        "ed41390fa57a21d06e6e3a3c4bc238bab8957fbb"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Dec 20 19:32:04 2010 +0100"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Dec 20 19:32:04 2010 +0100"
      },
      "message": "workqueue: allow chained queueing during destruction\n\nCurrently, destroy_workqueue() makes the workqueue deny all new\nqueueing by setting WQ_DYING and flushes the workqueue once before\nproceeding with destruction; however, there are cases where work items\nqueue more related work items.  Currently, such users need to\nexplicitly flush the workqueue multiple times depending on the\npossible depth of such chained queueing.\n\nThis patch updates the queueing path such that a work item can queue\nfurther work items on the same workqueue even when WQ_DYING is set.\nThe flush on destruction is automatically retried until the workqueue\nis empty.  This guarantees that the workqueue is empty on destruction\nwhile allowing chained queueing.\n\nThe flush retry logic whines if it takes too many retries to drain the\nworkqueue.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: James Bottomley \u003cJames.Bottomley@HansenPartnership.com\u003e\n"
    },
    {
      "commit": "2d64672ed38721b7a3815009d79bfb90a1f34a17",
      "tree": "91a52918b036a07bf8008eeae6e7dccf967fa4e0",
      "parents": [
        "3e6cd7a4b6a04cf354a18c9d2e7ecec8fa1772fb"
      ],
      "author": {
        "name": "Steven Rostedt",
        "email": "srostedt@redhat.com",
        "time": "Fri Dec 03 23:12:33 2010 -0500"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Dec 14 15:05:54 2010 +0100"
      },
      "message": "workqueue: It is likely that WORKER_NOT_RUNNING is true\n\nRunning the annotate branch profiler on three boxes, including my\nmain box that runs firefox, evolution, xchat, and is part of the distcc farm,\nshowed this with the likelys in the workqueue code:\n\n correct incorrect  %        Function                  File              Line\n ------- ---------  -        --------                  ----              ----\n      96   996253  99 wq_worker_sleeping             workqueue.c          703\n      96   996247  99 wq_worker_waking_up            workqueue.c          677\n\nThe likely()s in this case were assuming that WORKER_NOT_RUNNING will\nmost likely be false. But this is not the case. The reason is\n(and shown by adding trace_printks and testing it) that most of the time\nWORKER_PREP is set.\n\nIn worker_thread() we have:\n\n\tworker_clr_flags(worker, WORKER_PREP);\n\n\t[ do work stuff ]\n\n\tworker_set_flags(worker, WORKER_PREP, false);\n\n(that \u0027false\u0027 means not to wake up an idle worker)\n\nThe wq_worker_sleeping() is called from schedule when a worker thread\nis putting itself to sleep. Which happens most of the time outside\nof that [ do work stuff ].\n\nThe wq_worker_waking_up is called by the wakeup worker code, which\nis also callod outside that [ do work stuff ].\n\nThus, the likely and unlikely used by those two functions are actually\nbackwards.\n\nRemove the annotation and let gcc figure it out.\n\nAcked-by: Tejun Heo \u003ctj@kernel.org\u003e\nSigned-off-by: Steven Rostedt \u003crostedt@goodmis.org\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "e5cba24e3f018d4beb6acd101a82483c98f91ce7",
      "tree": "687339b9d285c7d19d5c521cae9a30bd9b389631",
      "parents": [
        "698fd6a2c3ca05ec796072defb5c415289a86cdc"
      ],
      "author": {
        "name": "Hitoshi Mitake",
        "email": "mitake@dcl.info.waseda.ac.jp",
        "time": "Fri Nov 26 12:06:44 2010 +0100"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Nov 26 12:06:44 2010 +0100"
      },
      "message": "workqueue: check the allocation of system_unbound_wq\n\nI found a trivial bug on initialization of workqueue.\nCurrent init_workqueues doesn\u0027t check the result of\nallocation of system_unbound_wq, this should be checked\nlike other queues.\n\nSigned-off-by: Hitoshi Mitake \u003cmitake@dcl.info.waseda.ac.jp\u003e\nCc: Arjan van de Ven \u003carjan@linux.intel.com\u003e\nCc: David Howells \u003cdhowells@redhat.com\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "ca1cab37d91cbe8a8333732540d43cabb54cfa85",
      "tree": "ea936dc8e5eb80b02fdf1d970bcb6f2e836051b9",
      "parents": [
        "99dc829256bb8cfcb1f58b7f118893fdbf608e60"
      ],
      "author": {
        "name": "Andrew Morton",
        "email": "akpm@linux-foundation.org",
        "time": "Tue Oct 26 14:22:34 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Oct 26 16:52:14 2010 -0700"
      },
      "message": "workqueues: s/ON_STACK/ONSTACK/\n\nSilly though it is, completions and wait_queue_heads use foo_ONSTACK\n(COMPLETION_INITIALIZER_ONSTACK, DECLARE_COMPLETION_ONSTACK,\n__WAIT_QUEUE_HEAD_INIT_ONSTACK and DECLARE_WAIT_QUEUE_HEAD_ONSTACK) so I\nguess workqueues should do the same thing.\n\ns/INIT_WORK_ON_STACK/INIT_WORK_ONSTACK/\ns/INIT_DELAYED_WORK_ON_STACK/INIT_DELAYED_WORK_ONSTACK/\n\nCc: Peter Zijlstra \u003ca.p.zijlstra@chello.nl\u003e\nAcked-by: Tejun Heo \u003ctj@kernel.org\u003e\nSigned-off-by: Andrew Morton \u003cakpm@linux-foundation.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "5260562754c0aa4b95eebb1f851eaccce7286365",
      "tree": "5702b9da6869d2769e4e88472b2c39b643187174",
      "parents": [
        "74eb94b218d087798a52c0b4f1379b635287a4b8"
      ],
      "author": {
        "name": "David Howells",
        "email": "dhowells@redhat.com",
        "time": "Mon Oct 25 23:41:11 2010 +0100"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Mon Oct 25 16:24:06 2010 -0700"
      },
      "message": "MN10300: Fix the PERCPU() alignment to allow for workqueues\n\nIn the MN10300 arch, we occasionally see an assertion being tripped in\nalloc_cwqs() at the following line:\n\n        /* just in case, make sure it\u0027s actually aligned */\n  ---\u003e  BUG_ON(!IS_ALIGNED(wq-\u003ecpu_wq.v, align));\n        return wq-\u003ecpu_wq.v ? 0 : -ENOMEM;\n\nThe values are:\n\n        wa-\u003ecpu_wq.v \u003d\u003e 0x902776e0\n        align \u003d\u003e 0x100\n\nand align is calculated by the following:\n\n        const size_t align \u003d max_t(size_t, 1 \u003c\u003c WORK_STRUCT_FLAG_BITS,\n                                   __alignof__(unsigned long long));\n\nThis is because the pointer in question (wq-\u003ecpu_wq.v) loses some of its\nlower bits to control flags, and so the object it points to must be\nsufficiently aligned to avoid the need to use those bits for pointing to\nthings.\n\nCurrently, 4 control bits and 4 colour bits are used in normal\ncircumstances, plus a debugging bit if debugging is set.  This requires\nthe cpu_workqueue_struct struct to be at least 256 bytes aligned (or 512\nbytes aligned with debugging).\n\nPERCPU() alignment on MN13000, however, is only 32 bytes as set in\nvmlinux.lds.S.  So we set this to PAGE_SIZE (4096) to match most other\narches and stick a comment in alloc_cwqs() for anyone else who triggers\nthe assertion.\n\nReported-by: Akira Takeuchi \u003ctakeuchi.akr@jp.panasonic.com\u003e\nSigned-off-by: David Howells \u003cdhowells@redhat.com\u003e\nAcked-by: Mark Salter \u003cmsalter@redhat.com\u003e\nCc: Tejun Heo \u003ctj@kernel.org\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "daaae6b010ac0f60c9c35e481589966f9f1fcc22",
      "tree": "94f4f463d898af0ad1926b8d21c15db94a0a411a",
      "parents": [
        "31ddd871fc3db73e2024cb3eb3ee5051edf5a80f"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Oct 19 11:28:15 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Oct 19 11:28:15 2010 +0200"
      },
      "message": "workqueue: remove in_workqueue_context()\n\nCommit a25909a4 (lockdep: Add an in_workqueue_context() lockdep-based\ntest function) added in_workqueue_context() but there hasn\u0027t been any\nin-kernel user and the lockdep annotation in workqueue is scheduled to\nchange.  Remove the unused function.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Paul E. McKenney \u003cpaulmck@linux.vnet.ibm.com\u003e\n"
    },
    {
      "commit": "31ddd871fc3db73e2024cb3eb3ee5051edf5a80f",
      "tree": "3a2d578ec9ebefecca5e4cad196023bbe1a7d0f2",
      "parents": [
        "10ccd84695c2a03075bad2f4fc728575fe9051f8"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Oct 19 11:14:49 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Oct 19 11:14:49 2010 +0200"
      },
      "message": "workqueue: Clarify that schedule_on_each_cpu is synchronous\n\nThe documentation for schedule_on_each_cpu() states that it calls a\nfunction on each online CPU from keventd.  This can easily be\ninterpreted as an asyncronous call because the description does not\nmention that flush_work is called.  Clarify that it is synchronous.\n\ntj: rephrased a bit\n\nSigned-off-by: Mel Gorman \u003cmel@csn.ul.ie\u003e\nReviewed-by: KOSAKI Motohiro \u003ckosaki.motohiro@jp.fujitsu.com\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "6370a6ad3b53df90b4700977f7718118a2cd524a",
      "tree": "2d1f45a19e66329813ce133b18f920d8c450b0c0",
      "parents": [
        "30310045dd20a286cf3800f063f79b468e132fb1"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Oct 11 15:12:27 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Oct 11 15:20:26 2010 +0200"
      },
      "message": "workqueue: add and use WQ_MEM_RECLAIM flag\n\nAdd WQ_MEM_RECLAIM flag which currently maps to WQ_RESCUER, mark\nWQ_RESCUER as internal and replace all external WQ_RESCUER usages to\nWQ_MEM_RECLAIM.\n\nThis makes the API users express the intent of the workqueue instead\nof indicating the internal mechanism used to guarantee forward\nprogress.  This is also to make it cleaner to add more semantics to\nWQ_MEM_RECLAIM.  For example, if deemed necessary, memory reclaim\nworkqueues can be made highpri.\n\nThis patch doesn\u0027t introduce any functional change.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Jeff Garzik \u003cjgarzik@pobox.com\u003e\nCc: Dave Chinner \u003cdavid@fromorbit.com\u003e\nCc: Steven Whitehouse \u003cswhiteho@redhat.com\u003e\n"
    },
    {
      "commit": "30310045dd20a286cf3800f063f79b468e132fb1",
      "tree": "535dd3273332f18b245afd6a4142fcc49ada8e61",
      "parents": [
        "cdadf0097cdca06c497ffaeb5982e028c6e4ed38"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Oct 11 11:51:57 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Oct 11 12:09:30 2010 +0200"
      },
      "message": "workqueue: fix HIGHPRI handling in keep_working()\n\nThe policy function keep_working() didn\u0027t check GCWQ_HIGHPRI_PENDING\nand could return %false with highpri work pending.  This could lead to\nlate execution of a highpri work which was delayed due to @max_active\nthrottling if other works are actively consuming CPU cycles.\n\nFor example, the following could happen.\n\n1. Work W0 which burns CPU cycles.\n\n2. Two works W1 and W2 are queued to a highpri wq w/ @max_active of 1.\n\n3. W1 starts executing and W2 is put to delayed queue.  W0 and W1 are\n   both runnable.\n\n4. W1 finishes which puts W2 to pending queue but keep_working()\n   incorrectly returns %false and the worker goes to sleep.\n\n5. W0 finishes and W2 starts execution.\n\nWith this patch applied, W2 starts execution as soon as W1 finishes.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "cdadf0097cdca06c497ffaeb5982e028c6e4ed38",
      "tree": "e02400ea54981e9621a30d3a2ce013e14f657e2e",
      "parents": [
        "97bd234701b2b39a0e749c1fe0e44f1d14c94292"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Oct 05 10:49:55 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Oct 05 10:49:55 2010 +0200"
      },
      "message": "workqueue: add queue_work and activate_work trace points\n\nThese two tracepoints allow tracking when and how a work is queued and\nactivated.  This patch is based on Frederic\u0027s patch to add queue_work\ntrace point.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Frederic Weisbecker \u003cfweisbec@gmail.com\u003e\n"
    },
    {
      "commit": "97bd234701b2b39a0e749c1fe0e44f1d14c94292",
      "tree": "fffbd48576c507f8a2e186ad0ebbf777aadf8bf0",
      "parents": [
        "09383498c5d35262e643bfdbae84826177a3c624"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Oct 05 10:41:14 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Oct 05 10:41:14 2010 +0200"
      },
      "message": "workqueue: prepare for more tracepoints\n\nDefine workqueue_work event class and use it for workqueue_execute_end\ntrace point.  Also, move trace/events/workqueue.h include downwards\nsuch that all struct definitions are visible to it.  This is to\nprepare for more tracepoints and doesn\u0027t cause any functional change.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Frederic Weisbecker \u003cfweisbec@gmail.com\u003e\n"
    },
    {
      "commit": "09383498c5d35262e643bfdbae84826177a3c624",
      "tree": "ec75ee767bff28cabbd1d1b82cfc3457147dda33",
      "parents": [
        "baf59022c37d43f202e62d5130e4bac5e825b426"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Sep 16 10:48:29 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Sun Sep 19 17:51:05 2010 +0200"
      },
      "message": "workqueue: implement flush[_delayed]_work_sync()\n\nImplement flush[_delayed]_work_sync().  These are flush functions\nwhich also make sure no CPU is still executing the target work from\nearlier queueing instances.  These are similar to\ncancel[_delayed]_work_sync() except that the target work item is\nflushed instead of cancelled.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "baf59022c37d43f202e62d5130e4bac5e825b426",
      "tree": "43eea7aac112b2ee07b195e00bce4b14465d1183",
      "parents": [
        "401a8d048eadfbe1b1c1bf53d3b614fcc894c61a"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Sep 16 10:42:16 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Sun Sep 19 17:51:05 2010 +0200"
      },
      "message": "workqueue: factor out start_flush_work()\n\nFactor out start_flush_work() from flush_work().  start_flush_work()\nhas @wait_executing argument which controls whether the barrier is\nqueued only if the work is pending or also if executing.  As\nflush_work() needs to wait for execution too, it uses %true.\n\nThis commit doesn\u0027t cause any behavior difference.  start_flush_work()\nwill be used to implement flush_work_sync().\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "401a8d048eadfbe1b1c1bf53d3b614fcc894c61a",
      "tree": "7e1761149643e395a33619deb67ec99d8949a7a4",
      "parents": [
        "81dcaf6516d8bbd75b894862c8ae7bba04380cfe"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Sep 16 10:36:00 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Sun Sep 19 17:51:05 2010 +0200"
      },
      "message": "workqueue: cleanup flush/cancel functions\n\nMake the following cleanup changes.\n\n* Relocate flush/cancel function prototypes and definitions.\n\n* Relocate wait_on_cpu_work() and wait_on_work() before\n  try_to_grab_pending().  These will be used to implement\n  flush_work_sync().\n\n* Make all flush/cancel functions return bool instead of int.\n\n* Update wait_on_cpu_work() and wait_on_work() to return %true if they\n  actually waited.\n\n* Add / update comments.\n\nThis patch doesn\u0027t cause any functional changes.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "c54fce6eff197d9c57c97afbf6c9722ce434fc8f",
      "tree": "c40c9bf65638399b13c47688f20e761cdd0fa89c",
      "parents": [
        "84e1d836ef0759a152578a961894824bde89596f"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Sep 10 16:51:36 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Sep 13 10:26:52 2010 +0200"
      },
      "message": "workqueue: add documentation\n\nUpdate copyright notice and add Documentation/workqueue.txt.\n\nRandy Dunlap, Dave Chinner: misc fixes.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReviewed-By: Florian Mickler \u003cflorian@mickler.org\u003e\nCc: Ingo Molnar \u003cmingo@redhat.com\u003e\nCc: Christoph Lameter \u003ccl@linux-foundation.org\u003e\nCc: Randy Dunlap \u003crandy.dunlap@oracle.com\u003e\nCc: Dave Chinner \u003cdavid@fromorbit.com\u003e\n"
    },
    {
      "commit": "cd4d4fc4137502f88ee871fc015a934dc28535e3",
      "tree": "09dfa0627996ca80d0fcc936b6fbd5080ee6e9d7",
      "parents": [
        "608307e6de2631e37f55f106a7cbbc560cb12751",
        "9c37547ab62f88aac3e1e3c2065b611f811de9b5"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 07 14:08:17 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Tue Sep 07 14:08:17 2010 -0700"
      },
      "message": "Merge branch \u0027for-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq\n\n* \u0027for-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq:\n  workqueue: use zalloc_cpumask_var() for gcwq-\u003emayday_mask\n  workqueue: fix GCWQ_DISASSOCIATED initialization\n  workqueue: Add a workqueue chapter to the tracepoint docbook\n  workqueue: fix cwq-\u003enr_active underflow\n  workqueue: improve destroy_workqueue() debuggability\n  workqueue: mark lock acquisition on worker_maybe_bind_and_lock()\n  workqueue: annotate lock context change\n  workqueue: free rescuer on destroy_workqueue\n"
    },
    {
      "commit": "9c37547ab62f88aac3e1e3c2065b611f811de9b5",
      "tree": "2a9c3655e25c93b4c3ce49c575d5d908045ebdd4",
      "parents": [
        "477a3c33d1efa0342a74bd02da2e049191993e2c"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Aug 31 11:18:34 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Aug 31 11:18:34 2010 +0200"
      },
      "message": "workqueue: use zalloc_cpumask_var() for gcwq-\u003emayday_mask\n\nalloc_mayday_mask() was using alloc_cpumask_var() making\ngcwq-\u003emayday_mask contain garbage after initialization on\nCONFIG_CPUMASK_OFFSTACK\u003dy configurations.  This combined with the\npreviously fixed GCWQ_DISASSOCIATED initialization bug could make\nrescuers fall into infinite loop trying to bind to an offline cpu.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: CAI Qian \u003ccaiqian@redhat.com\u003e\n"
    },
    {
      "commit": "477a3c33d1efa0342a74bd02da2e049191993e2c",
      "tree": "03d4ae1338f47016fbad6ff131007e009959b4a8",
      "parents": [
        "7c38875a0d0a9b90eee66be79e36995c86acc70c"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Aug 31 10:54:35 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Aug 31 10:54:35 2010 +0200"
      },
      "message": "workqueue: fix GCWQ_DISASSOCIATED initialization\n\ninit_workqueues() incorrectly marks workqueues for all possible CPUs\nassociated.  Combined with mayday_mask initialization bug, this can\nmake rescuers keep trying to bind to an offline gcwq indefinitely.\nFix init_workqueues() such that only online CPUs have their gcwqs have\nGCWQ_DISASSOCIATED cleared.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: CAI Qian \u003ccaiqian@redhat.com\u003e\n"
    },
    {
      "commit": "8a2e8e5dec7e29c56a46ba176c664ab6a3d04118",
      "tree": "57da96451bead4986dfcd82aadf47ba2c05745ac",
      "parents": [
        "e41e704bc4f49057fc68b643108366e6e6781aa3"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Wed Aug 25 10:33:56 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Wed Aug 25 10:33:56 2010 +0200"
      },
      "message": "workqueue: fix cwq-\u003enr_active underflow\n\ncwq-\u003enr_active is used to keep track of how many work items are active\nfor the cpu workqueue, where \u0027active\u0027 is defined as either pending on\nglobal worklist or executing.  This is used to implement the\nmax_active limit and workqueue freezing.  If a work item is queued\nafter nr_active has already reached max_active, the work item doesn\u0027t\nincrement nr_active and is put on the delayed queue and gets activated\nlater as previous active work items retire.\n\ntry_to_grab_pending() which is used in the cancellation path\nunconditionally decremented nr_active whether the work item being\ncancelled is currently active or delayed, so cancelling a delayed work\nitem makes nr_active underflow.  This breaks max_active enforcement\nand triggers BUG_ON() in destroy_workqueue() later on.\n\nThis patch fixes this bug by adding a flag WORK_STRUCT_DELAYED, which\nis set while a work item in on the delayed list and making\ntry_to_grab_pending() decrement nr_active iff the work item is\ncurrently active.\n\nThe addition of the flag enlarges cwq alignment to 256 bytes which is\ngetting a bit too large.  It\u0027s scheduled to be reduced back to 128\nbytes by merging WORK_STRUCT_PENDING and WORK_STRUCT_CWQ in the next\ndevel cycle.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: Johannes Berg \u003cjohannes@sipsolutions.net\u003e\n"
    },
    {
      "commit": "e41e704bc4f49057fc68b643108366e6e6781aa3",
      "tree": "8cc85208970ba0c9adf533903243e28c506f23ae",
      "parents": [
        "972fa1c5316d18c8297123e08e9b6930ca34f888"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Aug 24 14:22:47 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Aug 24 18:01:32 2010 +0200"
      },
      "message": "workqueue: improve destroy_workqueue() debuggability\n\nNow that the worklist is global, having works pending after wq\ndestruction can easily lead to oops and destroy_workqueue() have\nseveral BUG_ON()s to catch these cases.  Unfortunately, BUG_ON()\ndoesn\u0027t tell much about how the work became pending after the final\nflush_workqueue().\n\nThis patch adds WQ_DYING which is set before the final flush begins.\nIf a work is requested to be queued on a dying workqueue,\nWARN_ON_ONCE() is triggered and the request is ignored.  This clearly\nindicates which caller is trying to queue a work on a dying workqueue\nand keeps the system working in most cases.\n\nLocking rule comment is updated such that the \u0027I\u0027 rule includes\nmodifying the field from destruction path.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "972fa1c5316d18c8297123e08e9b6930ca34f888",
      "tree": "b96c34cb7ac493a80d959db6b361d2e87e854e06",
      "parents": [
        "06bd6ebffae36d3b105677598c48e8bd0a10b205"
      ],
      "author": {
        "name": "Namhyung Kim",
        "email": "namhyung@gmail.com",
        "time": "Sun Aug 22 23:19:43 2010 +0900"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Aug 23 11:37:49 2010 +0200"
      },
      "message": "workqueue: mark lock acquisition on worker_maybe_bind_and_lock()\n\nworker_maybe_bind_and_lock() actually grabs gcwq-\u003elock but was missing proper\nannotation. Add it. So this patch will remove following sparse warnings:\n\n kernel/workqueue.c:1214:13: warning: context imbalance in \u0027worker_maybe_bind_and_lock\u0027 - wrong count at exit\n arch/x86/include/asm/irqflags.h:44:9: warning: context imbalance in \u0027worker_rebind_fn\u0027 - unexpected unlock\n kernel/workqueue.c:1991:17: warning: context imbalance in \u0027rescuer_thread\u0027 - unexpected unlock\n\nSigned-off-by: Namhyung Kim \u003cnamhyung@gmail.com\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "06bd6ebffae36d3b105677598c48e8bd0a10b205",
      "tree": "d75a38a50378a3365bf57383297e0fe0372e916a",
      "parents": [
        "8d9df9f0844ed87541453a3ef91bfc9f487053b7"
      ],
      "author": {
        "name": "Namhyung Kim",
        "email": "namhyung@gmail.com",
        "time": "Sun Aug 22 23:19:42 2010 +0900"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Aug 23 11:37:49 2010 +0200"
      },
      "message": "workqueue: annotate lock context change\n\nSome of internal functions called within gcwq-\u003elock context releases and\nregrabs the lock but were missing proper annotations. Add it.\n\nSigned-off-by: Namhyung Kim \u003cnamhyung@gmail.com\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "e36c886a0f9d624377977fa6cae309cfd7f362fa",
      "tree": "f75e7c3e50a48c671ed4dff33103f601a2204af9",
      "parents": [
        "69b26c7ad00fd5b6129400725e2ffb95134a0e1b"
      ],
      "author": {
        "name": "Arjan van de Ven",
        "email": "arjan@linux.intel.com",
        "time": "Sat Aug 21 13:07:26 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Sat Aug 21 13:19:37 2010 -0700"
      },
      "message": "workqueue: Add basic tracepoints to track workqueue execution\n\nWith the introduction of the new unified work queue thread pools,\nwe lost one feature: It\u0027s no longer possible to know which worker\nis causing the CPU to wake out of idle. The result is that PowerTOP\nnow reports a lot of \"kworker/a:b\" instead of more readable results.\n\nThis patch adds a pair of tracepoints to the new workqueue code,\nsimilar in style to the timer/hrtimer tracepoints.\n\nWith this pair of tracepoints, the next PowerTOP can correctly\nreport which work item caused the wakeup (and how long it took):\n\nInterrupt (43)            i915      time   3.51ms    wakeups 141\nWork      ieee80211_iface_work      time   0.81ms    wakeups  29\nWork              do_dbs_timer      time   0.55ms    wakeups  24\nProcess                   Xorg      time  21.36ms    wakeups   4\nTimer    sched_rt_period_timer      time   0.01ms    wakeups   1\n\nSigned-off-by: Arjan van de Ven \u003carjan@linux.intel.com\u003e\nSigned-off-by: Linus Torvalds \u003ctorvalds@linux-foundation.org\u003e\n"
    },
    {
      "commit": "8d9df9f0844ed87541453a3ef91bfc9f487053b7",
      "tree": "b9779092c34a47de0cb268f4a631bc1e0024a01a",
      "parents": [
        "da5cabf80e2433131bf0ed8993abc0f7ea618c73"
      ],
      "author": {
        "name": "Xiaotian Feng",
        "email": "dfeng@redhat.com",
        "time": "Mon Aug 16 09:54:28 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Aug 16 09:55:01 2010 +0200"
      },
      "message": "workqueue: free rescuer on destroy_workqueue\n\nwq-\u003erescuer is not freed when wq is destroyed, leads a memory leak\nthen. This patch also remove a redundant line.\n\nSigned-off-by: Xiaotian Feng \u003cdfeng@redhat.com\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Oleg Nesterov \u003coleg@redhat.com\u003e\n"
    },
    {
      "commit": "f6500947a9cbb81cfa07ff344f16955d9c6ebe61",
      "tree": "6544ae45f39370fd35cb44076dc4628bd852bc19",
      "parents": [
        "38f51568005873a241a8ae6bf28c9ddd3f6a11ed"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Aug 09 11:50:34 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Mon Aug 09 11:50:34 2010 +0200"
      },
      "message": "workqueue: workqueue_cpu_callback() should be cpu_notifier instead of hotcpu_notifier\n\nCommit 6ee0578b (workqueue: mark init_workqueues as early_initcall)\nmade workqueue SMP initialization depend on workqueue_cpu_callback(),\nwhich however was registered as hotcpu_notifier() and didn\u0027t get\ncalled if CONFIG_HOTPLUG_CPU is not set.  This made gcwqs on non-boot\nCPUs not create their initial workers leading to boot failures.  Fix\nit by making it a cpu_notifier.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-and-bisected-by: walt \u003cw41ter@gmail.com\u003e\nTested-by: Markus Trippelsdorf \u003cmarkus@trippelsdorf.de\u003e\n"
    },
    {
      "commit": "38f51568005873a241a8ae6bf28c9ddd3f6a11ed",
      "tree": "88adaff7c44514bf3bc2610473d4b7fc266178c6",
      "parents": [
        "2d53056973079e6c2ffc0d7ae3afbdd3d4f18ae3"
      ],
      "author": {
        "name": "Namhyung Kim",
        "email": "namhyung@gmail.com",
        "time": "Sun Aug 08 14:24:09 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Sun Aug 08 14:24:09 2010 +0200"
      },
      "message": "workqueue: add missing __percpu markup in kernel/workqueue.c\n\nworks in schecule_on_each_cpu() is a percpu pointer but was missing\n__percpu markup.  Add it.\n\nSigned-off-by: Namhyung Kim \u003cnamhyung@gmail.com\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "3b7433b8a8a83c87972065b1852b7dcae691e464",
      "tree": "93fa2c003f8baef5ab0733b53bac77961ed5240c",
      "parents": [
        "4a386c3e177ca2fbc70c9283d0b46537844763a0",
        "6ee0578b4daaea01c96b172c6aacca43fd9807a6"
      ],
      "author": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Sat Aug 07 12:42:58 2010 -0700"
      },
      "committer": {
        "name": "Linus Torvalds",
        "email": "torvalds@linux-foundation.org",
        "time": "Sat Aug 07 12:42:58 2010 -0700"
      },
      "message": "Merge branch \u0027for-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq\n\n* \u0027for-linus\u0027 of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq: (55 commits)\n  workqueue: mark init_workqueues() as early_initcall()\n  workqueue: explain for_each_*cwq_cpu() iterators\n  fscache: fix build on !CONFIG_SYSCTL\n  slow-work: kill it\n  gfs2: use workqueue instead of slow-work\n  drm: use workqueue instead of slow-work\n  cifs: use workqueue instead of slow-work\n  fscache: drop references to slow-work\n  fscache: convert operation to use workqueue instead of slow-work\n  fscache: convert object to use workqueue instead of slow-work\n  workqueue: fix how cpu number is stored in work-\u003edata\n  workqueue: fix mayday_mask handling on UP\n  workqueue: fix build problem on !CONFIG_SMP\n  workqueue: fix locking in retry path of maybe_create_worker()\n  async: use workqueue for worker pool\n  workqueue: remove WQ_SINGLE_CPU and use WQ_UNBOUND instead\n  workqueue: implement unbound workqueue\n  workqueue: prepare for WQ_UNBOUND implementation\n  libata: take advantage of cmwq and remove concurrency limitations\n  workqueue: fix worker management invocation without pending works\n  ...\n\nFixed up conflicts in fs/cifs/* as per Tejun. Other trivial conflicts in\ninclude/linux/workqueue.h, kernel/trace/Kconfig and kernel/workqueue.c\n"
    },
    {
      "commit": "6ee0578b4daaea01c96b172c6aacca43fd9807a6",
      "tree": "bb82bb4e2a95704477da6c527b23af59c8c2a041",
      "parents": [
        "098849516dd522a343e659740c8f1394a5b7fa69"
      ],
      "author": {
        "name": "Suresh Siddha",
        "email": "suresh.b.siddha@intel.com",
        "time": "Fri Jul 30 14:57:37 2010 -0700"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Sun Aug 01 13:05:29 2010 +0200"
      },
      "message": "workqueue: mark init_workqueues() as early_initcall()\n\nMark init_workqueues() as early_initcall() and thus it will be initialized\nbefore smp bringup. init_workqueues() registers for the hotcpu notifier\nand thus it should cope with the processors that are brought online after\nthe workqueues are initialized.\n\nx86 smp bringup code uses workqueues and uses a workaround for the\ncold boot process (as the workqueues are initialized post smp_init()).\nMarking init_workqueues() as early_initcall() will pave the way for\ncleaning up this code.\n\nSigned-off-by: Suresh Siddha \u003csuresh.b.siddha@intel.com\u003e\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Oleg Nesterov \u003coleg@redhat.com\u003e\nCc: Andrew Morton \u003cakpm@linux-foundation.org\u003e\n"
    },
    {
      "commit": "098849516dd522a343e659740c8f1394a5b7fa69",
      "tree": "46e902aabf3734c68173e959735ee75760b9f911",
      "parents": [
        "40f2b6ffe525e975203c1621d4d4abaa7689b674"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Sun Aug 01 11:50:12 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Sun Aug 01 11:50:12 2010 +0200"
      },
      "message": "workqueue: explain for_each_*cwq_cpu() iterators\n\nfor_each_*cwq_cpu() are similar to regular CPU iterators except that\nit also considers the pseudo CPU number used for unbound workqueues.\nExplain them.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Andrew Morton \u003cakpm@linux-foundation.org\u003e\n"
    },
    {
      "commit": "e120153ddf8620fd0a194d301e9c5a8b28483bb5",
      "tree": "953ef1a61ca29d0486a6c8c3bb72dd8bbc080419",
      "parents": [
        "f2e005aaff4878a8ea93d5fb033a21389b72579a"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Jul 22 14:14:25 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Thu Jul 22 22:39:22 2010 +0200"
      },
      "message": "workqueue: fix how cpu number is stored in work-\u003edata\n\nOnce a work starts execution, its data contains the cpu number it was\non instead of pointing to cwq.  This is added by commit 7a22ad75\n(workqueue: carry cpu number in work data once execution starts) to\nreliably determine the work was last on even if the workqueue itself\nwas destroyed inbetween.\n\nWhether data points to a cwq or contains a cpu number was\ndistinguished by comparing the value against PAGE_OFFSET.  The\nassumption was that a cpu number should be below PAGE_OFFSET while a\npointer to cwq should be above it.  However, on architectures which\nuse separate address spaces for user and kernel spaces, this doesn\u0027t\nhold as PAGE_OFFSET is zero.\n\nFix it by using an explicit flag, WORK_STRUCT_CWQ, to mark what the\ndata field contains.  If the flag is set, it\u0027s pointing to a cwq;\notherwise, it contains a cpu number.\n\nReported on s390 and microblaze during linux-next testing.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: Sachin Sant \u003csachinp@in.ibm.com\u003e\nReported-by: Michal Simek \u003cmichal.simek@petalogix.com\u003e\nReported-by: Martin Schwidefsky \u003cschwidefsky@de.ibm.com\u003e\nTested-by: Martin Schwidefsky \u003cschwidefsky@de.ibm.com\u003e\nTested-by: Michal Simek \u003cmonstr@monstr.eu\u003e\n"
    },
    {
      "commit": "f2e005aaff4878a8ea93d5fb033a21389b72579a",
      "tree": "13929e2e6010d10ec84dfd43e2cd063002daecca",
      "parents": [
        "931ac77ef65d2d90ee1def63d2041402ec7c53ab"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 20 15:59:09 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 20 15:59:09 2010 +0200"
      },
      "message": "workqueue: fix mayday_mask handling on UP\n\nAll cpumasks are assumed to have cpu 0 permanently set on UP, so it\ncan\u0027t be used to signify whether there\u0027s something to be done for the\nCPU.  workqueue was using cpumask to track which CPU requested rescuer\nassistance and this led rescuer thread to think there always are\npending mayday requests on UP, which resulted in infinite busy loops.\n\nThis patch fixes the problem by introducing mayday_mask_t and\nassociated helpers which wrap cpumask on SMP and emulates its behavior\nusing bitops and unsigned long on UP.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Rusty Russell \u003crusty@rustcorp.com.au\u003e\n"
    },
    {
      "commit": "931ac77ef65d2d90ee1def63d2041402ec7c53ab",
      "tree": "370153ff6e85c9e8e0d00f1811d214dbcba6b00a",
      "parents": [
        "9f9c23644b07e7a51f6f39064e61c150be712932"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 20 11:07:48 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jul 20 11:15:14 2010 +0200"
      },
      "message": "workqueue: fix build problem on !CONFIG_SMP\n\nCommit f3421797 (workqueue: implement unbound workqueue) incorrectly\ntested CONFIG_SMP as part of a C expression in alloc/free_cwqs().  As\nCONFIG_SMP is not defined in UP, this breaks build.  Fix it by using\n\nFound during linux-next build test.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: Stephen Rothwell \u003csfr@canb.auug.org.au\u003e\n"
    },
    {
      "commit": "9f9c23644b07e7a51f6f39064e61c150be712932",
      "tree": "831849ae8bfd602b3333e8ea8e3beb2cf0dee348",
      "parents": [
        "083b804c4d3e1e3d0eace56bdbc0f674946d2847"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Wed Jul 14 11:31:20 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Wed Jul 14 11:31:20 2010 +0200"
      },
      "message": "workqueue: fix locking in retry path of maybe_create_worker()\n\nmaybe_create_worker() mismanaged locking when worker creation fails\nand it has to retry.  Fix locking and simplify lock manipulation.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nReported-by: Yong Zhang \u003cyong.zhang@windriver.com\u003e\n"
    },
    {
      "commit": "c7fc77f78f16d138ca997ce096a62f46e2e9420a",
      "tree": "0478e5dde66f6ff86d4baa0fe541748e1a6f1ed2",
      "parents": [
        "f34217977d717385a3e9fd7018ac39fade3964c0"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:03:51 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 11:00:08 2010 +0200"
      },
      "message": "workqueue: remove WQ_SINGLE_CPU and use WQ_UNBOUND instead\n\nWQ_SINGLE_CPU combined with @max_active of 1 is used to achieve full\nordering among works queued to a workqueue.  The same can be achieved\nusing WQ_UNBOUND as unbound workqueues always use the gcwq for\nWORK_CPU_UNBOUND.  As @max_active is always one and benefits from cpu\nlocality isn\u0027t accessible anyway, serving them with unbound workqueues\nshould be fine.\n\nDrop WQ_SINGLE_CPU support and use WQ_UNBOUND instead.  Note that most\nsingle thread workqueue users will be converted to use multithread or\nnon-reentrant instead and only the ones which require strict ordering\nwill keep using WQ_UNBOUND + @max_active of 1.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "f34217977d717385a3e9fd7018ac39fade3964c0",
      "tree": "7e05645e911eea15b33a368b91ac82ae12884e6d",
      "parents": [
        "bdbc5dd7de5d07d6c9d3536e598956165a031d4c"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:03:51 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 11:00:02 2010 +0200"
      },
      "message": "workqueue: implement unbound workqueue\n\nThis patch implements unbound workqueue which can be specified with\nWQ_UNBOUND flag on creation.  An unbound workqueue has the following\nproperties.\n\n* It uses a dedicated gcwq with a pseudo CPU number WORK_CPU_UNBOUND.\n  This gcwq is always online and disassociated.\n\n* Workers are not bound to any CPU and not concurrency managed.  Works\n  are dispatched to workers as soon as possible and the only applied\n  limitation is @max_active.  IOW, all unbound workqeueues are\n  implicitly high priority.\n\nUnbound workqueues can be used as simple execution context provider.\nContexts unbound to any cpu are served as soon as possible.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Arjan van de Ven \u003carjan@linux.intel.com\u003e\nCc: David Howells \u003cdhowells@redhat.com\u003e\n"
    },
    {
      "commit": "bdbc5dd7de5d07d6c9d3536e598956165a031d4c",
      "tree": "1f0f263126c2fc2e07a032df1e9ad3fecb534c9a",
      "parents": [
        "ad72cf9885c536e3adae03f8337557ac9dd1e4bb"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:03:51 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:59:57 2010 +0200"
      },
      "message": "workqueue: prepare for WQ_UNBOUND implementation\n\nIn preparation of WQ_UNBOUND addition, make the following changes.\n\n* Add WORK_CPU_* constants for pseudo cpu id numbers used (currently\n  only WORK_CPU_NONE) and use them instead of NR_CPUS.  This is to\n  allow another pseudo cpu id for unbound cpu.\n\n* Reorder WQ_* flags.\n\n* Make workqueue_struct-\u003ecpu_wq a union which contains a percpu\n  pointer, regular pointer and an unsigned long value and use\n  kzalloc/kfree() in UP allocation path.  This will be used to\n  implement unbound workqueues which will use only one cwq on SMPs.\n\n* Move alloc_cwqs() allocation after initialization of wq fields, so\n  that alloc_cwqs() has access to wq-\u003eflags.\n\n* Trivial relocation of wq local variables in freeze functions.\n\nThese changes don\u0027t cause any functional change.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "d313dd85ad846bc768d58e9ceb28588f917f4c9a",
      "tree": "b61b92f270b9fedc577e8196d605c93d695052d4",
      "parents": [
        "a1e453d2799760ecf2e09ecd45b80edbe7ff540e"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:03:51 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:03:51 2010 +0200"
      },
      "message": "workqueue: fix worker management invocation without pending works\n\nWhen there\u0027s no pending work to do, worker_thread() goes back to sleep\nafter waking up without checking whether worker management is\nnecessary.  This means that idle worker exit requests can be ignored\nif the gcwq stays empty.\n\nFix it by making worker_thread() always check whether worker\nmanagement is necessary before going to sleep.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "a1e453d2799760ecf2e09ecd45b80edbe7ff540e",
      "tree": "d2f9383f2703c762051a8379872244b1a4ebda2e",
      "parents": [
        "4ce48b37bfedc2bc11e61eae76784887e88b922c"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:03:51 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:03:51 2010 +0200"
      },
      "message": "workqueue: fix incorrect cpu number BUG_ON() in get_work_gcwq()\n\nget_work_gcwq() was incorrectly triggering BUG_ON() if cpu number is\nequal to or higher than num_possible_cpus() instead of nr_cpu_ids.\nFix it.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "4ce48b37bfedc2bc11e61eae76784887e88b922c",
      "tree": "0829ba93c3bb5f586bacd11c3f21711b3de04da2",
      "parents": [
        "cb444766996395d4370bcc17ec895dd4e13ceb72"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:03:51 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:03:51 2010 +0200"
      },
      "message": "workqueue: fix race condition in flush_workqueue()\n\nWhen one flusher is cascading to the next flusher, it first sets\nwq-\u003efirst_flusher to the next one and sets up the next flush cycle.\nIf there\u0027s nothing to do for the next cycle, it clears\nwq-\u003eflush_flusher and proceeds to the one after that.\n\nIf the woken up flusher checks wq-\u003efirst_flusher before it gets\ncleared, it will incorrectly assume the role of the first flusher,\nwhich triggers BUG_ON() sanity check.\n\nFix it by checking wq-\u003efirst_flusher again after grabbing the mutex.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "cb444766996395d4370bcc17ec895dd4e13ceb72",
      "tree": "e682bd69dafadae8b27861888ec0802107d5a93a",
      "parents": [
        "fb0e7beb5c1b6fb4da786ba709d7138373d5fb22"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:03:50 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Fri Jul 02 10:03:50 2010 +0200"
      },
      "message": "workqueue: use worker_set/clr_flags() only from worker itself\n\nworker_set/clr_flags() assume that if none of NOT_RUNNING flags is set\nthe worker must be contributing to nr_running which is only true if\nthe worker is actually running.\n\nAs when called from self, it is guaranteed that the worker is running,\nthose functions can be safely used from the worker itself and they\naren\u0027t necessary from other places anyway.  Make the following changes\nto fix the bug.\n\n* Make worker_set/clr_flags() whine if not called from self.\n\n* Convert all places which called those functions from other tasks to\n  manipulate flags directly.\n\n* Make trustee_thread() directly clear nr_running after setting\n  WORKER_ROGUE on all workers.  This is the only place where\n  nr_running manipulation is necessary outside of workers themselves.\n\n* While at it, add sanity check for nr_running in worker_enter_idle().\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "fb0e7beb5c1b6fb4da786ba709d7138373d5fb22",
      "tree": "e222b2238ed691ced6eaeb47733f7e4c2b9a3c37",
      "parents": [
        "649027d73a6309ac34dc2886362e662bd73456dc"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:15 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:15 2010 +0200"
      },
      "message": "workqueue: implement cpu intensive workqueue\n\nThis patch implements cpu intensive workqueue which can be specified\nwith WQ_CPU_INTENSIVE flag on creation.  Works queued to a cpu\nintensive workqueue don\u0027t participate in concurrency management.  IOW,\nit doesn\u0027t contribute to gcwq-\u003enr_running and thus doesn\u0027t delay\nexcution of other works.\n\nNote that although cpu intensive works won\u0027t delay other works, they\ncan be delayed by other works.  Combine with WQ_HIGHPRI to avoid being\ndelayed by other works too.\n\nAs the name suggests this is useful when using workqueue for cpu\nintensive works.  Workers executing cpu intensive works are not\nconsidered for workqueue concurrency management and left for the\nscheduler to manage.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Andrew Morton \u003cakpm@linux-foundation.org\u003e\n"
    },
    {
      "commit": "649027d73a6309ac34dc2886362e662bd73456dc",
      "tree": "4faf07773683ff5ec2b120d9070dbbb590199057",
      "parents": [
        "dcd989cb73ab0f7b722d64ab6516f101d9f43f88"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:14 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:14 2010 +0200"
      },
      "message": "workqueue: implement high priority workqueue\n\nThis patch implements high priority workqueue which can be specified\nwith WQ_HIGHPRI flag on creation.  A high priority workqueue has the\nfollowing properties.\n\n* A work queued to it is queued at the head of the worklist of the\n  respective gcwq after other highpri works, while normal works are\n  always appended at the end.\n\n* As long as there are highpri works on gcwq-\u003eworklist,\n  [__]need_more_worker() remains %true and process_one_work() wakes up\n  another worker before it start executing a work.\n\nThe above two properties guarantee that works queued to high priority\nworkqueues are dispatched to workers and start execution as soon as\npossible regardless of the state of other works.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Andi Kleen \u003candi@firstfloor.org\u003e\nCc: Andrew Morton \u003cakpm@linux-foundation.org\u003e\n"
    },
    {
      "commit": "dcd989cb73ab0f7b722d64ab6516f101d9f43f88",
      "tree": "8c2f14e708367cb67dd9d29f2da0f7e5f454cf31",
      "parents": [
        "d320c03830b17af64e4547075003b1eeb274bc6c"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:14 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:14 2010 +0200"
      },
      "message": "workqueue: implement several utility APIs\n\nImplement the following utility APIs.\n\n workqueue_set_max_active()\t: adjust max_active of a wq\n workqueue_congested()\t\t: test whether a wq is contested\n work_cpu()\t\t\t: determine the last / current cpu of a work\n work_busy()\t\t\t: query whether a work is busy\n\n* Anton Blanchard fixed missing ret initialization in work_busy().\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Anton Blanchard \u003canton@samba.org\u003e\n"
    },
    {
      "commit": "d320c03830b17af64e4547075003b1eeb274bc6c",
      "tree": "9917a69dc2efa6f37c54097c4651408faf4b343b",
      "parents": [
        "b71ab8c2025caef8db719aa41af0ed735dc543cd"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:14 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:14 2010 +0200"
      },
      "message": "workqueue: s/__create_workqueue()/alloc_workqueue()/, and add system workqueues\n\nThis patch makes changes to make new workqueue features available to\nits users.\n\n* Now that workqueue is more featureful, there should be a public\n  workqueue creation function which takes paramters to control them.\n  Rename __create_workqueue() to alloc_workqueue() and make 0\n  max_active mean WQ_DFL_ACTIVE.  In the long run, all\n  create_workqueue_*() will be converted over to alloc_workqueue().\n\n* To further unify access interface, rename keventd_wq to system_wq\n  and export it.\n\n* Add system_long_wq and system_nrt_wq.  The former is to host long\n  running works separately (so that flush_scheduled_work() dosen\u0027t\n  take so long) and the latter guarantees any queued work item is\n  never executed in parallel by multiple CPUs.  These will be used by\n  future patches to update workqueue users.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "b71ab8c2025caef8db719aa41af0ed735dc543cd",
      "tree": "8cc2c6164acf5fe82e8d8d05924590cb80fe088d",
      "parents": [
        "e22bee782b3b00bd4534ae9b1c5fb2e8e6573c5c"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:14 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:14 2010 +0200"
      },
      "message": "workqueue: increase max_active of keventd and kill current_is_keventd()\n\nDefine WQ_MAX_ACTIVE and create keventd with max_active set to half of\nit which means that keventd now can process upto WQ_MAX_ACTIVE / 2 - 1\nworks concurrently.  Unless some combination can result in dependency\nloop longer than max_active, deadlock won\u0027t happen and thus it\u0027s\nunnecessary to check whether current_is_keventd() before trying to\nschedule a work.  Kill current_is_keventd().\n\n(Lockdep annotations are broken.  We need lock_map_acquire_read_norecurse())\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Ingo Molnar \u003cmingo@elte.hu\u003e\nCc: Thomas Gleixner \u003ctglx@linutronix.de\u003e\nCc: Christoph Lameter \u003ccl@linux-foundation.org\u003e\nCc: Tony Luck \u003ctony.luck@intel.com\u003e\nCc: Andi Kleen \u003cak@linux.intel.com\u003e\nCc: Oleg Nesterov \u003coleg@redhat.com\u003e\n"
    },
    {
      "commit": "e22bee782b3b00bd4534ae9b1c5fb2e8e6573c5c",
      "tree": "9854d22294699d9ec27e28f70c05f479e5640abd",
      "parents": [
        "d302f0178223802a1e496ba90c66193b7721c9c1"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:14 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:14 2010 +0200"
      },
      "message": "workqueue: implement concurrency managed dynamic worker pool\n\nInstead of creating a worker for each cwq and putting it into the\nshared pool, manage per-cpu workers dynamically.\n\nWorks aren\u0027t supposed to be cpu cycle hogs and maintaining just enough\nconcurrency to prevent work processing from stalling due to lack of\nprocessing context is optimal.  gcwq keeps the number of concurrent\nactive workers to minimum but no less.  As long as there\u0027s one or more\nrunning workers on the cpu, no new worker is scheduled so that works\ncan be processed in batch as much as possible but when the last\nrunning worker blocks, gcwq immediately schedules new worker so that\nthe cpu doesn\u0027t sit idle while there are works to be processed.\n\ngcwq always keeps at least single idle worker around.  When a new\nworker is necessary and the worker is the last idle one, the worker\nassumes the role of \"manager\" and manages the worker pool -\nie. creates another worker.  Forward-progress is guaranteed by having\ndedicated rescue workers for workqueues which may be necessary while\ncreating a new worker.  When the manager is having problem creating a\nnew worker, mayday timer activates and rescue workers are summoned to\nthe cpu and execute works which might be necessary to create new\nworkers.\n\nTrustee is expanded to serve the role of manager while a CPU is being\ntaken down and stays down.  As no new works are supposed to be queued\non a dead cpu, it just needs to drain all the existing ones.  Trustee\ncontinues to try to create new workers and summon rescuers as long as\nthere are pending works.  If the CPU is brought back up while the\ntrustee is still trying to drain the gcwq from the previous offlining,\nthe trustee will kill all idles ones and tell workers which are still\nbusy to rebind to the cpu, and pass control over to gcwq which assumes\nthe manager role as necessary.\n\nConcurrency managed worker pool reduces the number of workers\ndrastically.  Only workers which are necessary to keep the processing\ngoing are created and kept.  Also, it reduces cache footprint by\navoiding unnecessarily switching contexts between different workers.\n\nPlease note that this patch does not increase max_active of any\nworkqueue.  All workqueues can still only process one work per cpu.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "d302f0178223802a1e496ba90c66193b7721c9c1",
      "tree": "d9282d8a6a69b6b5b1db9fbe97301f6338af8752",
      "parents": [
        "7e11629d0efec829cbf62366143ba1081944a70e"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "message": "workqueue: implement worker_{set|clr}_flags()\n\nImplement worker_{set|clr}_flags() to manipulate worker flags.  These\nare currently simple wrappers but logics to track the current worker\nstate and the current level of concurrency will be added.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "7e11629d0efec829cbf62366143ba1081944a70e",
      "tree": "946f6383f420fafc89550ad2f7efbdfee441ccbb",
      "parents": [
        "18aa9effad4adb2c1efe123af4eb24fec9f59b30"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "message": "workqueue: use shared worklist and pool all workers per cpu\n\nUse gcwq-\u003eworklist instead of cwq-\u003eworklist and break the strict\nassociation between a cwq and its worker.  All works queued on a cpu\nare queued on gcwq-\u003eworklist and processed by any available worker on\nthe gcwq.\n\nAs there no longer is strict association between a cwq and its worker,\nwhether a work is executing can now only be determined by calling\n[__]find_worker_executing_work().\n\nAfter this change, the only association between a cwq and its worker\nis that a cwq puts a worker into shared worker pool on creation and\nkills it on destruction.  As all workqueues are still limited to\nmax_active of one, this means that there are always at least as many\nworkers as active works and thus there\u0027s no danger for deadlock.\n\nThe break of strong association between cwqs and workers requires\nsomewhat clumsy changes to current_is_keventd() and\ndestroy_workqueue().  Dynamic worker pool management will remove both\nclumsy changes.  current_is_keventd() won\u0027t be necessary at all as the\nonly reason it exists is to avoid queueing a work from a work which\nwill be allowed just fine.  The clumsy part of destroy_workqueue() is\nadded because a worker can only be destroyed while idle and there\u0027s no\nguarantee a worker is idle when its wq is going down.  With dynamic\npool management, workers are not associated with workqueues at all and\nonly idle ones will be submitted to destroy_workqueue() so the code\nwon\u0027t be necessary anymore.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "18aa9effad4adb2c1efe123af4eb24fec9f59b30",
      "tree": "76975b37ae0ef1ebf460aaab68359ed7a12fe37a",
      "parents": [
        "7a22ad757ec75186ad43a5b4670fa7423ee8f480"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "message": "workqueue: implement WQ_NON_REENTRANT\n\nWith gcwq managing all the workers and work-\u003edata pointing to the last\ngcwq it was on, non-reentrance can be easily implemented by checking\nwhether the work is still running on the previous gcwq on queueing.\nImplement it.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "7a22ad757ec75186ad43a5b4670fa7423ee8f480",
      "tree": "698807765421a46dcb5e2daa609336a61d1cdea5",
      "parents": [
        "8cca0eea3964b72b14e8c3f88e3a40bef7b9113e"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "message": "workqueue: carry cpu number in work data once execution starts\n\nTo implement non-reentrant workqueue, the last gcwq a work was\nexecuted on must be reliably obtainable as long as the work structure\nis valid even if the previous workqueue has been destroyed.\n\nTo achieve this, work-\u003edata will be overloaded to carry the last cpu\nnumber once execution starts so that the previous gcwq can be located\nreliably.  This means that cwq can\u0027t be obtained from work after\nexecution starts but only gcwq.\n\nImplement set_work_{cwq|cpu}(), get_work_[g]cwq() and\nclear_work_data() to set work data to the cpu number when starting\nexecution, access the overloaded work data and clear it after\ncancellation.\n\nqueue_delayed_work_on() is updated to preserve the last cpu while\nin-flight in timer and other callers which depended on getting cwq\nfrom work after execution starts are converted to depend on gcwq\ninstead.\n\n* Anton Blanchard fixed compile error on powerpc due to missing\n  linux/threads.h include.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\nCc: Anton Blanchard \u003canton@samba.org\u003e\n"
    },
    {
      "commit": "8cca0eea3964b72b14e8c3f88e3a40bef7b9113e",
      "tree": "49a8e4496ad0ffa99386f6566bc9ffc0c0cc39b2",
      "parents": [
        "502ca9d819792e7d79b6e002afe9094c641fe410"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "message": "workqueue: add find_worker_executing_work() and track current_cwq\n\nNow that all the workers are tracked by gcwq, we can find which worker\nis executing a work from gcwq.  Implement find_worker_executing_work()\nand make worker track its current_cwq so that we can find things the\nother way around.  This will be used to implement non-reentrant wqs.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "502ca9d819792e7d79b6e002afe9094c641fe410",
      "tree": "5f06a8845643f1007ce9807636cde4057f8761a9",
      "parents": [
        "db7bccf45cb87522096b8f43144e31ca605a9f24"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:13 2010 +0200"
      },
      "message": "workqueue: make single thread workqueue shared worker pool friendly\n\nReimplement st (single thread) workqueue so that it\u0027s friendly to\nshared worker pool.  It was originally implemented by confining st\nworkqueues to use cwq of a fixed cpu and always having a worker for\nthe cpu.  This implementation isn\u0027t very friendly to shared worker\npool and suboptimal in that it ends up crossing cpu boundaries often.\n\nReimplement st workqueue using dynamic single cpu binding and\ncwq-\u003elimit.  WQ_SINGLE_THREAD is replaced with WQ_SINGLE_CPU.  In a\nsingle cpu workqueue, at most single cwq is bound to the wq at any\ngiven time.  Arbitration is done using atomic accesses to\nwq-\u003esingle_cpu when queueing a work.  Once bound, the binding stays\ntill the workqueue is drained.\n\nNote that the binding is never broken while a workqueue is frozen.\nThis is because idle cwqs may have works waiting in delayed_works\nqueue while frozen.  On thaw, the cwq is restarted if there are any\ndelayed works or unbound otherwise.\n\nWhen combined with max_active limit of 1, single cpu workqueue has\nexactly the same execution properties as the original single thread\nworkqueue while allowing sharing of per-cpu workers.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "db7bccf45cb87522096b8f43144e31ca605a9f24",
      "tree": "d16cc764243fb6feaa4c9dea5398e139c8012124",
      "parents": [
        "c8e55f360210c1bc49bea5d62bc3939b7ee13483"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "message": "workqueue: reimplement CPU hotplugging support using trustee\n\nReimplement CPU hotplugging support using trustee thread.  On CPU\ndown, a trustee thread is created and each step of CPU down is\nexecuted by the trustee and workqueue_cpu_callback() simply drives and\nwaits for trustee state transitions.\n\nCPU down operation no longer waits for works to be drained but trustee\nsticks around till all pending works have been completed.  If CPU is\nbrought back up while works are still draining,\nworkqueue_cpu_callback() tells trustee to step down and tell workers\nto rebind to the cpu.\n\nAs it\u0027s difficult to tell whether cwqs are empty if it\u0027s freezing or\nfrozen, trustee doesn\u0027t consider draining to be complete while a gcwq\nis freezing or frozen (tracked by new GCWQ_FREEZING flag).  Also,\nworkers which get unbound from their cpu are marked with WORKER_ROGUE.\n\nTrustee based implementation doesn\u0027t bring any new feature at this\npoint but it will be used to manage worker pool when dynamic shared\nworker pool is implemented.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "c8e55f360210c1bc49bea5d62bc3939b7ee13483",
      "tree": "c2e88d5576e5f65c036ba60c52f9518901f2a2f0",
      "parents": [
        "8b03ae3cde59af9facab7c831b4141515d5dbcc8"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "message": "workqueue: implement worker states\n\nImplement worker states.  After created, a worker is STARTED.  While a\nworker isn\u0027t processing a work, it\u0027s IDLE and chained on\ngcwq-\u003eidle_list.  While processing a work, a worker is BUSY and\nchained on gcwq-\u003ebusy_hash.  Also, gcwq now counts the number of all\nworkers and idle ones.\n\nworker_thread() is restructured to reflect state transitions.\ncwq-\u003emore_work is removed and waking up a worker makes it check for\nevents.  A worker is killed by setting DIE flag while it\u0027s IDLE and\nwaking it up.\n\nThis gives gcwq better visibility of what\u0027s going on and allows it to\nfind out whether a work is executing quickly which is necessary to\nhave multiple workers processing the same cwq.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "8b03ae3cde59af9facab7c831b4141515d5dbcc8",
      "tree": "900829ac17fa941e9819208489081e4de1218ac4",
      "parents": [
        "a0a1a5fd4fb15ec61117c759fe9f5c16c53d9e9c"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "message": "workqueue: introduce global cwq and unify cwq locks\n\nThere is one gcwq (global cwq) per each cpu and all cwqs on an cpu\npoint to it.  A gcwq contains a lock to be used by all cwqs on the cpu\nand an ida to give IDs to workers belonging to the cpu.\n\nThis patch introduces gcwq, moves worker_ida into gcwq and make all\ncwqs on the same cpu use the cpu\u0027s gcwq-\u003elock instead of separate\nlocks.  gcwq-\u003eida is now protected by gcwq-\u003elock too.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "a0a1a5fd4fb15ec61117c759fe9f5c16c53d9e9c",
      "tree": "6df8eddcaeff6cde892c8cae6bdfa7653805e144",
      "parents": [
        "1e19ffc63dbbaea7a7d1c63d99c38d3e5a4c7edf"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "message": "workqueue: reimplement workqueue freeze using max_active\n\nCurrently, workqueue freezing is implemented by marking the worker\nfreezeable and calling try_to_freeze() from dispatch loop.\nReimplement it using cwq-\u003elimit so that the workqueue is frozen\ninstead of the worker.\n\n* workqueue_struct-\u003esaved_max_active is added which stores the\n  specified max_active on initialization.\n\n* On freeze, all cwq-\u003emax_active\u0027s are quenched to zero.  Freezing is\n  complete when nr_active on all cwqs reach zero.\n\n* On thaw, all cwq-\u003emax_active\u0027s are restored to wq-\u003esaved_max_active\n  and the worklist is repopulated.\n\nThis new implementation allows having single shared pool of workers\nper cpu.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "1e19ffc63dbbaea7a7d1c63d99c38d3e5a4c7edf",
      "tree": "357690d6017682a4a21824f7d3f34a83406a136d",
      "parents": [
        "affee4b294a0fc97d67c8a77dc080c4dd262a79e"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "message": "workqueue: implement per-cwq active work limit\n\nAdd cwq-\u003enr_active, cwq-\u003emax_active and cwq-\u003edelayed_work.  nr_active\ncounts the number of active works per cwq.  A work is active if it\u0027s\nflushable (colored) and is on cwq\u0027s worklist.  If nr_active reaches\nmax_active, new works are queued on cwq-\u003edelayed_work and activated\nlater as works on the cwq complete and decrement nr_active.\n\ncwq-\u003emax_active can be specified via the new @max_active parameter to\n__create_workqueue() and is set to 1 for all workqueues for now.  As\neach cwq has only single worker now, this double queueing doesn\u0027t\ncause any behavior difference visible to its users.\n\nThis will be used to reimplement freeze/thaw and implement shared\nworker pool.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    },
    {
      "commit": "affee4b294a0fc97d67c8a77dc080c4dd262a79e",
      "tree": "5b3fd79640ad7940e0abbed193a192d3919f259d",
      "parents": [
        "c34056a3fdde777c079cc8a70785c2602f2586cb"
      ],
      "author": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "committer": {
        "name": "Tejun Heo",
        "email": "tj@kernel.org",
        "time": "Tue Jun 29 10:07:12 2010 +0200"
      },
      "message": "workqueue: reimplement work flushing using linked works\n\nA work is linked to the next one by having WORK_STRUCT_LINKED bit set\nand these links can be chained.  When a linked work is dispatched to a\nworker, all linked works are dispatched to the worker\u0027s newly added\n-\u003escheduled queue and processed back-to-back.\n\nCurrently, as there\u0027s only single worker per cwq, having linked works\ndoesn\u0027t make any visible behavior difference.  This change is to\nprepare for multiple shared workers per cpu.\n\nSigned-off-by: Tejun Heo \u003ctj@kernel.org\u003e\n"
    }
  ],
  "next": "c34056a3fdde777c079cc8a70785c2602f2586cb"
}
