{ "results": [ { "index": 0, "function": "mac80211_hwsim_link_info_changed", "module": "vmlinux", "function_type": "normal", "address_computed": "0xffffffff870a6c76", "address_formatted": "0xffffffff870a6c76 (0xffffffff870a6800 + 0x476)", "addr2line_address": "0xffffffff870a6c76", "source": { "primary": { "function": "mac80211_hwsim_link_info_changed", "file": "drivers/net/wireless/virtual/mac80211_hwsim.c", "line": 0 }, "inlined_frames": [] }, "function_source": null, "note": "addr2line returned line 0 for drivers/net/wireless/virtual/mac80211_hwsim.c \u2014 DWARF may be incomplete at this address", "disasm": "ffffffff870a6c3c:\tadd 0x0(%r13),%r12\nffffffff870a6c40:\tmovabs $0xdffffc0000000000,%rax\nffffffff870a6c4a:\tcmpb $0x0,(%r14,%rax,1)\nffffffff870a6c4f:\tmov %rax,%r14\nffffffff870a6c52:\tmov 0x20(%rsp),%rdi\nffffffff870a6c57:\tje ffffffff870a6c63 \nffffffff870a6c59:\tcall ffffffff8230dea0 <__asan_report_load8_noabort>\nffffffff870a6c5e:\tmov 0x20(%rsp),%rdi\nffffffff870a6c63:\tmov (%rdi),%rcx\nffffffff870a6c66:\tmov %ecx,%esi\nffffffff870a6c68:\tmov %r12,%rax\nffffffff870a6c6b:\tshr $0x20,%rax\nffffffff870a6c6f:\tje ffffffff870a6cd1 \nffffffff870a6c71:\tmov %r12,%rax\nffffffff870a6c74:\txor %edx,%edx\nffffffff870a6c76:\tdiv %rsi <<< crash\nffffffff870a6c79:\tjmp ffffffff870a6cd8 \nffffffff870a6c7b:\tcall ffffffff81c5a3b0 <__sanitizer_cov_trace_pc>\nffffffff870a6c80:\tmov 0x20(%rsp),%r14\nffffffff870a6c85:\tlea 0x10(%r14),%rdi\nffffffff870a6c89:\tcall ffffffff81b25130 " }, { "index": 1, "function": "drv_link_info_changed", "module": "vmlinux", "function_type": "normal", "address_computed": "0xffffffff8b126765", "address_formatted": "0xffffffff8b126765 (0xffffffff8b126260 + 0x505)", "addr2line_correction": "-1 (return address)", "addr2line_address": "0xffffffff8b126764", "source": { "primary": { "function": "drv_link_info_changed", "file": "net/mac80211/driver-ops.c", "line": 0 }, "inlined_frames": [] }, "function_source": null, "note": "addr2line returned line 0 for net/mac80211/driver-ops.c \u2014 DWARF may be incomplete at this address" }, { "index": 2, "function": "ieee80211_offchannel_return", "module": "vmlinux", "function_type": "normal", "address_computed": "0xffffffff8b163635", "address_formatted": "0xffffffff8b163635 (0xffffffff8b1632c0 + 0x375)", "addr2line_correction": "-1 (return address)", "addr2line_address": "0xffffffff8b163634", "source": { "primary": { "function": "ieee80211_offchannel_return", "file": "net/mac80211/offchannel.c", "line": 160 }, "inlined_frames": [] }, "function_source": { "file": "net/mac80211/offchannel.c", "start_line": 132, "end_line": 169, "code": "\nvoid ieee80211_offchannel_return(struct ieee80211_local *local)\n{\n struct ieee80211_sub_if_data *sdata;\n\n lockdep_assert_wiphy(local->hw.wiphy);\n\n if (WARN_ON(!local->emulate_chanctx))\n return;\n\n list_for_each_entry(sdata, &local->interfaces, list) {\n if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE)\n continue;\n\n if (sdata->vif.type != NL80211_IFTYPE_MONITOR)\n clear_bit(SDATA_STATE_OFFCHANNEL, &sdata->state);\n\n if (!ieee80211_sdata_running(sdata))\n continue;\n\n /* Tell AP we're back */\n if (sdata->vif.type == NL80211_IFTYPE_STATION &&\n sdata->u.mgd.associated)\n ieee80211_offchannel_ps_disable(sdata);\n\n if (test_and_clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED,\n &sdata->state)) {\n sdata->vif.bss_conf.enable_beacon = true;\n ieee80211_link_info_change_notify(\n sdata, &sdata->deflink,\n BSS_CHANGED_BEACON_ENABLED);\n }\n }\n\n ieee80211_wake_queues_by_reason(&local->hw, IEEE80211_MAX_QUEUE_MAP,\n IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL,\n false);\n}\n" }, "git_blame_hashes": [ "0a44dfc070749514b804ccac0b1fd38718f7daa1", "445ea4e83ec50668cc9ad7e5cf96d242f19165e8", "6c17b77b67587b9f9e3070fb89fe98cef3187131", "7b7090b4c6a906cc7c3e2a460335f705b93f4506", "aacde9ee45225f7e0b90960f479aef83c66bfdc0", "b203ffc3a447eb8d9e6120b783ddee081b143061", "be0df01dae0f21303a7a523dbba35159cf6dfe77", "cca07b00a56d6ddd339e457dfd1a229222b9acf5", "d6a83228823fc0cc8d79d95c9f0bf568b7317862", "d8675a63518c6148827838058feb7f18403faed1", "f142c6b906da451ded2c7a8e17b2a0e6fee3e891", "f6e8cb72ad4b0381d79df4575ec1f5c5df2e73b9", "fe57d9f5c0a2c1ef97ba8cdc42cfda5743f287b8" ], "recent_commits": [ { "hash": "0a44dfc07074", "subject": "wifi: mac80211: simplify non-chanctx drivers" }, { "hash": "be0df01dae0f", "subject": "wifi: mac80211: reduce iflist_mtx" }, { "hash": "d8675a63518c", "subject": "wifi: mac80211: RCU-ify link/link_conf pointers" }, { "hash": "7b7090b4c6a9", "subject": "wifi: mac80211: split bss_info_changed method" }, { "hash": "cca07b00a56d", "subject": "mac80211: introduce refcount for queue_stop_reasons" }, { "hash": "445ea4e83ec5", "subject": "mac80211: stop queues temporarily for flushing" }, { "hash": "6c17b77b6758", "subject": "mac80211: Fix tx queue handling during scans" }, { "hash": "9ebea3829fac", "subject": "Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless" }, { "hash": "d6a83228823f", "subject": "mac80211: track enable_beacon explicitly" }, { "hash": "aacde9ee4522", "subject": "mac80211: synchronize scan off/on-channel and PS states" } ] }, { "index": 3, "function": "__ieee80211_scan_completed", "module": "vmlinux", "function_type": "normal", "address_computed": "0xffffffff8b15db6a", "address_formatted": "0xffffffff8b15db6a (0xffffffff8b15d410 + 0x75a)", "addr2line_correction": "-1 (return address)", "addr2line_address": "0xffffffff8b15db69", "source": { "primary": { "function": "__ieee80211_scan_completed", "file": "net/mac80211/scan.c", "line": 519 }, "inlined_frames": [] }, "function_source": { "file": "net/mac80211/scan.c", "start_line": 447, "end_line": 538, "code": "\nstatic void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)\n{\n struct ieee80211_local *local = hw_to_local(hw);\n bool hw_scan = test_bit(SCAN_HW_SCANNING, &local->scanning);\n bool was_scanning = local->scanning;\n struct cfg80211_scan_request *scan_req;\n struct ieee80211_sub_if_data *scan_sdata;\n struct ieee80211_sub_if_data *sdata;\n\n lockdep_assert_wiphy(local->hw.wiphy);\n\n /*\n * It's ok to abort a not-yet-running scan (that\n * we have one at all will be verified by checking\n * local->scan_req next), but not to complete it\n * successfully.\n */\n if (WARN_ON(!local->scanning && !aborted))\n aborted = true;\n\n if (WARN_ON(!local->scan_req))\n return;\n\n scan_sdata = rcu_dereference_protected(local->scan_sdata,\n lockdep_is_held(&local->hw.wiphy->mtx));\n\n if (hw_scan && !aborted &&\n !ieee80211_hw_check(&local->hw, SINGLE_SCAN_ON_ALL_BANDS) &&\n ieee80211_prep_hw_scan(scan_sdata)) {\n int rc;\n\n rc = drv_hw_scan(local,\n rcu_dereference_protected(local->scan_sdata,\n lockdep_is_held(&local->hw.wiphy->mtx)),\n local->hw_scan_req);\n\n if (rc == 0)\n return;\n\n /* HW scan failed and is going to be reported as aborted,\n * so clear old scan info.\n */\n memset(&local->scan_info, 0, sizeof(local->scan_info));\n aborted = true;\n }\n\n kfree(local->hw_scan_req);\n local->hw_scan_req = NULL;\n\n scan_req = rcu_dereference_protected(local->scan_req,\n lockdep_is_held(&local->hw.wiphy->mtx));\n\n RCU_INIT_POINTER(local->scan_req, NULL);\n RCU_INIT_POINTER(local->scan_sdata, NULL);\n\n local->scanning = 0;\n local->scan_chandef.chan = NULL;\n\n synchronize_rcu();\n\n if (scan_req != local->int_scan_req) {\n local->scan_info.aborted = aborted;\n cfg80211_scan_done(scan_req, &local->scan_info);\n }\n\n /* Set power back to normal operating levels. */\n ieee80211_hw_conf_chan(local);\n\n if (!hw_scan && was_scanning) {\n ieee80211_configure_filter(local);\n drv_sw_scan_complete(local, scan_sdata);\n ieee80211_offchannel_return(local);\n }\n\n ieee80211_recalc_idle(local);\n\n ieee80211_mlme_notify_scan_completed(local);\n ieee80211_ibss_notify_scan_completed(local);\n\n /* Requeue all the work that might have been ignored while\n * the scan was in progress; if there was none this will\n * just be a no-op for the particular interface.\n */\n list_for_each_entry(sdata, &local->interfaces, list) {\n if (ieee80211_sdata_running(sdata))\n wiphy_work_queue(sdata->local->hw.wiphy, &sdata->work);\n }\n\n if (was_scanning)\n ieee80211_start_next_roc(local);\n}\n" }, "git_blame_hashes": [ "07ef03ee8b280a536b38ccfe512b9556996f0492", "0a44dfc070749514b804ccac0b1fd38718f7daa1", "0a51b27e956bd9580296c48191b78175ed8b5971", "0c2bef4621c5feb5bda9068c9964b2e9acf57017", "0cd8080e46b834fa72026112488ab61d4b82f03a", "16114496d684a3df4ce09f7c6b7557a8b2922795", "2a5193119269062608582418deba7af82844159a", "2ad2274c58ee2dcaf9ccde5c63ff30f59b138f77", "30686bf7f5b3c30831761e188a6e3cb33580fa48", "469002983fc90c2ff0959e2b03335c0fe2e4d5a9", "4d36ec58239eec44d77839ef6c25108efcbbb58c", "4fa11ec726a32ea6dd768dbb2e2af3453a98ec0a", "5cff20e6c5a6591a79d3b027af222870f52bb550", "60deb9f10eec5c6a20252ed36238b55d8b614a2c", "6d3560d4fc9c5b9fe1a07a63926ea70512c69c32", "6ea0a69ca21bbddab5b3979c2190013b0263e749", "6eb11a9a311a0f7e5b9b66c18f7498a26c9ec206", "7947d3e075cde1a18e538f2dafbc850aa356ff79", "7ca15a0ae865067aac8d36e27e0acbe4a8f1e70a", "7d10f6b179bc82e6633a4521a4cd69ad6846723e", "8bd2a2489971d3bcdbae6d9d9e9414f04cb0543b", "a033afca2dc9d225cec1227a0554ad97ac00879d", "a2b70e833e189a4aefb2d3b668e3d7046dcc45c2", "a344d6778a98e4c19ac871f369e399e6356edcb3", "aacde9ee45225f7e0b90960f479aef83c66bfdc0", "ac35180032fbc5d80b29af00ba4881815ceefcb6", "b23b025fe246f3acc2988eb6d400df34c27cb8ae", "c56ef6725068c0ce499e517409c0da226ef51b08", "d07bfd8b6f20a81d7ec65c50f35b053d9e3aa740", "de95a54b1aebe5592cae971ca5e5d9ec6a381a17", "e229f844d7223b7063bea1e649203ac521a58fe1", "e2fd5dbc1c7031be5b5de043bcc0a18c7a59a68a", "e9da68ddea6030b214dfe420564d48bb579f58fc", "f3b85252f081581a8f257545ed748062dce7798b", "fbe9c429f195111bbf7f1630efa19aee295fd8e7" ], "recent_commits": [ { "hash": "ac35180032fb", "subject": "wifi: mac80211: fix RCU list iterations" }, { "hash": "0a44dfc07074", "subject": "wifi: mac80211: simplify non-chanctx drivers" }, { "hash": "0cd8080e46b8", "subject": "wifi: mac80211: remove local->mtx" }, { "hash": "16114496d684", "subject": "wifi: mac80211: use wiphy work for sdata->work" }, { "hash": "9837ec955b46", "subject": "Merge tag 'wireless-next-2022-09-03' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next" }, { "hash": "a033afca2dc9", "subject": "wifi: mac80211: fix double SW scan stop" }, { "hash": "60deb9f10eec", "subject": "wifi: mac80211: Fix UAF in ieee80211_scan_rx()" }, { "hash": "2ad2274c58ee", "subject": "mac80211: Add HE 6GHz capabilities element to probe request" }, { "hash": "e9da68ddea60", "subject": "mac80211: allow hardware scan to fall back to software" }, { "hash": "7d10f6b179bc", "subject": "mac80211: report failure to start (partial) scan as scan abort" } ] }, { "index": 4, "function": "cfg80211_wiphy_work", "module": "vmlinux", "function_type": "normal", "address_computed": "0xffffffff8af01cbf", "address_formatted": "0xffffffff8af01cbf (0xffffffff8af019f0 + 0x2cf)", "addr2line_correction": "-1 (return address)", "addr2line_address": "0xffffffff8af01cbe", "source": { "primary": { "function": "cfg80211_wiphy_work", "file": "net/wireless/core.c", "line": 0 }, "inlined_frames": [] }, "function_source": null, "note": "addr2line returned line 0 for net/wireless/core.c \u2014 DWARF may be incomplete at this address" }, { "index": 5, "function": "process_scheduled_works", "module": "vmlinux", "function_type": "normal", "address_computed": "0xffffffff818e85ad", "address_formatted": "0xffffffff818e85ad (0xffffffff818e7a50 + 0xb5d)", "addr2line_correction": "-1 (return address)", "addr2line_address": "0xffffffff818e85ac", "source": { "primary": { "function": "process_one_work", "file": "kernel/workqueue.c", "line": 0 }, "inlined_frames": [ { "function": "process_scheduled_works", "file": "kernel/workqueue.c", "line": 0 } ] }, "function_source": null, "note": "addr2line returned line 0 for kernel/workqueue.c \u2014 DWARF may be incomplete at this address" }, { "index": 6, "function": "worker_thread", "module": "vmlinux", "function_type": "normal", "address_computed": "0xffffffff818f0613", "address_formatted": "0xffffffff818f0613 (0xffffffff818efbc0 + 0xa53)", "addr2line_correction": "-1 (return address)", "addr2line_address": "0xffffffff818f0612", "source": { "primary": { "function": "worker_thread", "file": "kernel/workqueue.c", "line": 3466 }, "inlined_frames": [] }, "function_source": { "file": "kernel/workqueue.c", "start_line": 3402, "end_line": 3483, "code": " *\n * The worker thread function. All workers belong to a worker_pool -\n * either a per-cpu one or dynamic unbound one. These workers process all\n * work items regardless of their specific target workqueue. The only\n * exception is work items which belong to workqueues with a rescuer which\n * will be explained in rescuer_thread().\n *\n * Return: 0\n */\nstatic int worker_thread(void *__worker)\n{\n struct worker *worker = __worker;\n struct worker_pool *pool = worker->pool;\n\n /* tell the scheduler that this is a workqueue worker */\n set_pf_worker(true);\nwoke_up:\n raw_spin_lock_irq(&pool->lock);\n\n /* am I supposed to die? */\n if (unlikely(worker->flags & WORKER_DIE)) {\n raw_spin_unlock_irq(&pool->lock);\n set_pf_worker(false);\n /*\n * The worker is dead and PF_WQ_WORKER is cleared, worker->pool\n * shouldn't be accessed, reset it to NULL in case otherwise.\n */\n worker->pool = NULL;\n ida_free(&pool->worker_ida, worker->id);\n return 0;\n }\n\n worker_leave_idle(worker);\nrecheck:\n /* no more worker necessary? */\n if (!need_more_worker(pool))\n goto sleep;\n\n /* do we need to manage? */\n if (unlikely(!may_start_working(pool)) && manage_workers(worker))\n goto recheck;\n\n /*\n * ->scheduled list can only be filled while a worker is\n * preparing to process a work or actually processing it.\n * Make sure nobody diddled with it while I was sleeping.\n */\n WARN_ON_ONCE(!list_empty(&worker->scheduled));\n\n /*\n * Finish PREP stage. We're guaranteed to have at least one idle\n * worker or that someone else has already assumed the manager\n * role. This is where @worker starts participating in concurrency\n * management if applicable and concurrency management is restored\n * after being rebound. See rebind_workers() for details.\n */\n worker_clr_flags(worker, WORKER_PREP | WORKER_REBOUND);\n\n do {\n struct work_struct *work =\n list_first_entry(&pool->worklist,\n struct work_struct, entry);\n\n if (assign_work(work, worker, NULL))\n process_scheduled_works(worker);\n } while (keep_working(pool));\n\n worker_set_flags(worker, WORKER_PREP);\nsleep:\n /*\n * pool->lock is held and there's no work to process and no need to\n * manage, sleep. Workers are woken up only while holding\n * pool->lock or from local cpu, so setting the current state\n * before releasing pool->lock is enough to prevent losing any\n * event.\n */\n worker_enter_idle(worker);\n __set_current_state(TASK_IDLE);\n raw_spin_unlock_irq(&pool->lock);\n schedule();\n goto woke_up;\n}\n" }, "git_blame_hashes": [ "197f6accacdaf9a0cf4da3c4ac8dd788633c0e38", "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2", "228f1d0018ba6b24c9f718a97a5bc35b24f1e1e3", "3af24433efac62f451bfdb1cf1edb7181fb73645", "4690c4ab56c71919893ca25252f2dd65b58188c7", "6183c009f6cd94b42e5812adcfd4ba6220a196e1", "63d95a9150ee3bbd4117fcd609dee40313b454d9", "73613840a8896f4f859eea489cb4a7a656939e70", "873eaca6eaf84b1d1ed5b7259308c6a4fca70fdc", "a9ab775bcadf122d91e1a201eb66ae2eec90365a", "a9b8a985294debae00f6c087dfec8c384d30a3b9", "affee4b294a0fc97d67c8a77dc080c4dd262a79e", "bd7bdd43dcb81bb08240b9401b36a104f77dc135", "c34056a3fdde777c079cc8a70785c2602f2586cb", "c5a94a618e7ac86b20f53d947f68d7cee6a4c6bc", "c5aa87bbf4b23f5e4f167489406daeb0ed275c47", "c8e55f360210c1bc49bea5d62bc3939b7ee13483", "d185af300fe43c130083851ca918ea2bb9600f0f", "d313dd85ad846bc768d58e9ceb28588f917f4c9a", "d565ed6309300304de4a865a04adef07a85edc45", "db7bccf45cb87522096b8f43144e31ca605a9f24", "e22bee782b3b00bd4534ae9b1c5fb2e8e6573c5c", "e441b56fe438fd126b9eea7d30c57d3cd3f34e14" ], "recent_commits": [ { "hash": "73613840a889", "subject": "workqueue: Clear worker->pool in the worker thread context" }, { "hash": "98cc1730c894", "subject": "workqueue: Remove incorrect \"WARN_ON_ONCE(!list_empty(&worker->entry));\" from dying worker" }, { "hash": "b02c520fee63", "subject": "Merge tag 'wq-for-6.11' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq" }, { "hash": "f4b7b53c94af", "subject": "workqueue: Detach workers directly in idle_cull_fn()" }, { "hash": "68f83057b913", "subject": "workqueue: Reap workers via kthread_stop() and remove detach_completion" }, { "hash": "2a1b02bcba78", "subject": "workqueue: Refactor worker ID formatting and make wq_worker_comm() use full ID string" }, { "hash": "873eaca6eaf8", "subject": "workqueue: Factor out work to worker assignment and collision handling" }, { "hash": "c0ab017d43f4", "subject": "workqueue: Cleanups around process_scheduled_works()" }, { "hash": "e02b93124855", "subject": "workqueue: Unbind kworkers before sending them to exit()" }, { "hash": "e441b56fe438", "subject": "workqueue: Replace deprecated ida_simple_*() with ida_alloc()/ida_free()" } ] }, { "index": 7, "function": "kthread", "module": "vmlinux", "function_type": "normal", "address_computed": "0xffffffff81908118", "address_formatted": "0xffffffff81908118 (0xffffffff81907d90 + 0x388)", "addr2line_correction": "-1 (return address)", "addr2line_address": "0xffffffff81908117", "source": { "primary": { "function": "kthread", "file": "kernel/kthread.c", "line": 436 }, "inlined_frames": [] }, "function_source": { "file": "kernel/kthread.c", "start_line": 379, "end_line": 439, "code": "\nstatic int kthread(void *_create)\n{\n static const struct sched_param param = { .sched_priority = 0 };\n /* Copy data: it's on kthread's stack */\n struct kthread_create_info *create = _create;\n int (*threadfn)(void *data) = create->threadfn;\n void *data = create->data;\n struct completion *done;\n struct kthread *self;\n int ret;\n\n self = to_kthread(current);\n\n /* Release the structure when caller killed by a fatal signal. */\n done = xchg(&create->done, NULL);\n if (!done) {\n kfree(create->full_name);\n kfree(create);\n kthread_exit(-EINTR);\n }\n\n self->full_name = create->full_name;\n self->threadfn = threadfn;\n self->data = data;\n\n /*\n * The new thread inherited kthreadd's priority and CPU mask. Reset\n * back to default in case they have been changed.\n */\n sched_setscheduler_nocheck(current, SCHED_NORMAL, ¶m);\n\n /* OK, tell user we're spawned, wait for stop or wakeup */\n __set_current_state(TASK_UNINTERRUPTIBLE);\n create->result = current;\n /*\n * Thread is going to call schedule(), do not preempt it,\n * or the creator may spend more time in wait_task_inactive().\n */\n preempt_disable();\n complete(done);\n schedule_preempt_disabled();\n preempt_enable();\n\n self->started = 1;\n\n /*\n * Apply default node affinity if no call to kthread_bind[_mask]() nor\n * kthread_affine_preferred() was issued before the first wake-up.\n */\n if (!(current->flags & PF_NO_SETAFFINITY) && !self->preferred_affinity)\n kthread_affine_node();\n\n ret = -EINTR;\n if (!test_bit(KTHREAD_SHOULD_STOP, &self->flags)) {\n cgroup_kthread_ready();\n __kthread_parkme(self);\n ret = threadfn(data);\n }\n kthread_exit(ret);\n}\n" }, "git_blame_hashes": [ "00b89fe0197f0c55a045775c11553c0cdb7082fe", "1a7243ca4074beed97b68d7235a6e34862fc2cd6", "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2", "1da5c46fa965ff90f5ffc080b6ab3fae5e227bc3", "26c7295be0c5e6da3fa45970e9748be983175b1b", "2a1d446019f9a5983ec5a335b95e8593fdb6fa2e", "3217ab97f14c5c8f9f975ed8c40c351164b0b10e", "4d13f4304fa43471bfea101658a11feec7b28ac0", "52782c92ac85c4e393eb4a903a62e6c24afa633f", "5eacb68a358503cb350eaf68599a0d6caef569ab", "60ba9c38b9316efa3eb1c8a927bee6f8a4f101a5", "63706172f332fd3f6e7458ebfb35fa6de9c21dc5", "73c279927f89561ecb45b2dfdf9314bafcfd9f67", "73e0c116594d99f807754b15e474690635a87249", "77f88796cee819b9c4562b0b6b44691b3b7755b1", "786235eeba0e1e85e5cbbb9f97d1087ad03dfa21", "a076e4bca2fdabb9e45d86722cc72c0944da5f94", "bbda86e988d4c124e4cfa816291cbd583ae8bfb1", "d1a89197589c4a77468298ef2b14ff4084c4ea29", "d25c83c6606ffc3abdf0868136ad3399f648ad70" ], "recent_commits": [ { "hash": "60ba9c38b931", "subject": "kthread: Comment on the purpose and placement of kthread_affine_node() call" }, { "hash": "4d13f4304fa4", "subject": "kthread: Implement preferred affinity" }, { "hash": "d1a89197589c", "subject": "kthread: Default affine kthread to its preferred NUMA node" }, { "hash": "5eacb68a3585", "subject": "kthread: Make sure kthread hasn't started while binding it" }, { "hash": "73e0c116594d", "subject": "kthread: Pass in the thread's name during creation" }, { "hash": "d25c83c6606f", "subject": "kthread: make it clear that kthread_create_on_node() might be terminated by any fatal signal" }, { "hash": "04d4e665a609", "subject": "sched/isolation: Use single feature type while referring to housekeeping cpumask" }, { "hash": "40966e316f86", "subject": "kthread: Ensure struct kthread is present for all kthreads" }, { "hash": "bbda86e988d4", "subject": "exit: Implement kthread_exit" }, { "hash": "1a7243ca4074", "subject": "kthread: Move prio/affinite change into the newly created thread" } ] }, { "index": 8, "function": "ret_from_fork", "module": "vmlinux", "function_type": "normal", "address_computed": "0xffffffff816bcae4", "address_formatted": "0xffffffff816bcae4 (0xffffffff816bc5d0 + 0x514)", "addr2line_correction": "-1 (return address)", "addr2line_address": "0xffffffff816bcae3", "source": { "primary": { "function": "ret_from_fork", "file": "arch/x86/kernel/process.c", "line": 158 }, "inlined_frames": [] }, "function_source": { "file": "arch/x86/kernel/process.c", "start_line": 150, "end_line": 168, "code": "\n__visible void ret_from_fork(struct task_struct *prev, struct pt_regs *regs,\n int (*fn)(void *), void *fn_arg)\n{\n schedule_tail(prev);\n\n /* Is this a kernel thread? */\n if (unlikely(fn)) {\n fn(fn_arg);\n /*\n * A kernel thread is allowed to return here after successfully\n * calling kernel_execve(). Exit to userspace to complete the\n * execve() syscall.\n */\n regs->ax = 0;\n }\n\n syscall_exit_to_user_mode(regs);\n}\n" }, "git_blame_hashes": [ "2fff071d28b54f050f62654dad4ec111b8416d8e", "3aec4ecb3d1f313a8ab985df7cab07c4af81f478" ], "recent_commits": [ { "hash": "3aec4ecb3d1f", "subject": "x86: Rewrite ret_from_fork() in C" }, { "hash": "2fff071d28b5", "subject": "x86/process: Unify copy_thread_tls()" } ] }, { "index": 9, "function": "ret_from_fork_asm", "module": "vmlinux", "function_type": "normal", "address_computed": "0xffffffff813340aa", "address_formatted": "0xffffffff813340aa (0xffffffff81334090 + 0x1a)", "addr2line_correction": "-1 (return address)", "addr2line_address": "0xffffffff813340a9", "source": { "primary": { "function": "ret_from_fork_asm", "file": "arch/x86/entry/entry_64.S", "line": 245 }, "inlined_frames": [] }, "function_source": { "file": "arch/x86/entry/entry_64.S", "start_line": 205, "end_line": 305, "code": " */\n FILL_RETURN_BUFFER %r12, RSB_CLEAR_LOOPS, X86_FEATURE_RSB_CTXSW\n\n /* restore callee-saved registers */\n popq %r15\n popq %r14\n popq %r13\n popq %r12\n popq %rbx\n popq %rbp\n\n jmp __switch_to\nSYM_FUNC_END(__switch_to_asm)\n.popsection\n\n/*\n * A newly forked process directly context switches into this address.\n *\n * rax: prev task we switched from\n * rbx: kernel thread func (NULL for user thread)\n * r12: kernel thread arg\n */\n.pushsection .text, \"ax\"\nSYM_CODE_START(ret_from_fork_asm)\n /*\n * This is the start of the kernel stack; even through there's a\n * register set at the top, the regset isn't necessarily coherent\n * (consider kthreads) and one cannot unwind further.\n *\n * This ensures stack unwinds of kernel threads terminate in a known\n * good state.\n */\n UNWIND_HINT_END_OF_STACK\n ANNOTATE_NOENDBR // copy_thread\n CALL_DEPTH_ACCOUNT\n\n movq %rax, %rdi /* prev */\n movq %rsp, %rsi /* regs */\n movq %rbx, %rdx /* fn */\n movq %r12, %rcx /* fn_arg */\n call ret_from_fork\n\n /*\n * Set the stack state to what is expected for the target function\n * -- at this point the register set should be a valid user set\n * and unwind should work normally.\n */\n UNWIND_HINT_REGS\n\n#ifdef CONFIG_X86_FRED\n ALTERNATIVE \"jmp swapgs_restore_regs_and_return_to_usermode\", \\\n \"jmp asm_fred_exit_user\", X86_FEATURE_FRED\n#else\n jmp swapgs_restore_regs_and_return_to_usermode\n#endif\nSYM_CODE_END(ret_from_fork_asm)\n.popsection\n\n.macro DEBUG_ENTRY_ASSERT_IRQS_OFF\n#ifdef CONFIG_DEBUG_ENTRY\n pushq %rax\n SAVE_FLAGS\n testl $X86_EFLAGS_IF, %eax\n jz .Lokay_\\@\n ud2\n.Lokay_\\@:\n popq %rax\n#endif\n.endm\n\nSYM_CODE_START(xen_error_entry)\n ANNOTATE_NOENDBR\n UNWIND_HINT_FUNC\n PUSH_AND_CLEAR_REGS save_ret=1\n ENCODE_FRAME_POINTER 8\n UNTRAIN_RET_FROM_CALL\n RET\nSYM_CODE_END(xen_error_entry)\n\n/**\n * idtentry_body - Macro to emit code calling the C function\n * @cfunc: C function to be called\n * @has_error_code: Hardware pushed error code on stack\n */\n.macro idtentry_body cfunc has_error_code:req\n\n /*\n * Call error_entry() and switch to the task stack if from userspace.\n *\n * When in XENPV, it is already in the task stack, and it can't fault\n * for native_iret() nor native_load_gs_index() since XENPV uses its\n * own pvops for IRET and load_gs_index(). And it doesn't need to\n * switch the CR3. So it can skip invoking error_entry().\n */\n ALTERNATIVE \"call error_entry; movq %rax, %rsp\", \\\n \"call xen_error_entry\", X86_FEATURE_XENPV\n\n ENCODE_FRAME_POINTER\n UNWIND_HINT_REGS\n\n movq %rsp, %rdi /* pt_regs pointer into 1st argument*/\n" }, "git_blame_hashes": [ "0100301bfdf56a2a370c7157b5ab0fbf9313e1cd", "1d3e53e8624a3ec85f4041ca6d973da7c1575938", "1eeb207f870f746a863e5c59321d837d2d91c218", "2c08b9b38f5b0f4a6c2d29be22b695e4ec4a556b", "2e7e5bbb1c3c8d502edeb5c0670eac4995134b6f", "3aec4ecb3d1f313a8ab985df7cab07c4af81f478", "3e3f069504344c241f89737e4af014f83fca0b27", "51ef2a4da7ec347e3315af69a426ac36fab98a6c", "520a7e80c96d655fbe4650d9cc985bd9d0443389", "5d8213864ade86b48fc492584ea86d65a62f892e", "616d24835eeafa8ef3466479db028abfdfc77531", "64cbd0acb58203fb769ed2f4eab526d43e243847", "8a055d7f411d41755ce30db5bb65b154777c4b78", "96c64806b4bf35f5edb465cafa6cec490e424a30", "b9f6976bfb949121bb6e1e6f4fd9909735729148", "c22cf380c79c4bb0e502b0343f57271b17626424", "c995efd5a740d9cbafbf58bde4973e8b50b4d761", "cfa82a00533f7074011a3a49fbb6ed1b1f6fa010", "d147553b64bad34d2f92cb7d8ba454ae95c3baac", "d1c99108af3c5992640aa2afa7d2e88c3775c06e", "e17f8234538d1ff708673f287a42457c4dee720d", "e2dcb5f1390715244aec12dbd6f294863ca37b88", "fafe5e74229fd3f425e3cbfc68b90e615aa6d62f" ], "recent_commits": [ { "hash": "51ef2a4da7ec", "subject": "x86/fred: Let ret_from_fork_asm() jmp to asm_fred_exit_user when FRED is enabled" }, { "hash": "2e7e5bbb1c3c", "subject": "x86: Fix kthread unwind" }, { "hash": "3aec4ecb3d1f", "subject": "x86: Rewrite ret_from_fork() in C" }, { "hash": "fb799447ae29", "subject": "x86,objtool: Split UNWIND_HINT_EMPTY in two" }, { "hash": "5d8213864ade", "subject": "x86/retbleed: Add SKL return thunk" }, { "hash": "c22cf380c79c", "subject": "x86/entry: Make some entry symbols global" }, { "hash": "67e93ddd5d0b", "subject": "x86/entry: Align SYM_CODE_START() variants" }, { "hash": "2c08b9b38f5b", "subject": "x86/entry: Move PUSH_AND_CLEAR_REGS() back into error_entry" }, { "hash": "b2620facef48", "subject": "x86/speculation: Fix RSB filling with CONFIG_RETPOLINE=n" }, { "hash": "d147553b64ba", "subject": "x86/xen: Add UNTRAIN_RET" } ] } ] }