€•Ï�Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ%/translations/zh_CN/gpu/xe/xe_migrate”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/zh_TW/gpu/xe/xe_migrate”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/it_IT/gpu/xe/xe_migrate”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/ja_JP/gpu/xe/xe_migrate”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/ko_KR/gpu/xe/xe_migrate”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/pt_BR/gpu/xe/xe_migrate”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ%/translations/sp_SP/gpu/xe/xe_migrate”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ*SPDX-License-Identifier: (GPL-2.0+ OR MIT)”h]”hŒ*SPDX-License-Identifier: (GPL-2.0+ OR MIT)”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ?/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ Migrate Layer”h]”hŒ Migrate Layer”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)�”}”(hŒØThe Xe migrate layer is used generate jobs which can copy memory (eviction), clear memory, or program tables (binds). This layer exists in every GT, has a migrate engine, and uses a special VM for all generated jobs.”h]”hŒØThe Xe migrate layer is used generate jobs which can copy memory (eviction), clear memory, or program tables (binds). This layer exists in every GT, has a migrate engine, and uses a special VM for all generated jobs.”…”�”}”(hhßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:7: ./drivers/gpu/drm/xe/xe_migrate_doc.h”h´K hhÊh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSpecial VM details”h]”hŒSpecial VM details”…”�”}”(hhñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhîh³Nh´NubhÞ)�”}”(hŒêThe special VM is configured with a page structure where we can dynamically map BOs which need to be copied and cleared, dynamically map other VM's page table BOs for updates, and identity map the entire device's VRAM with 1 GB pages.”h]”hŒîThe special VM is configured with a page structure where we can dynamically map BOs which need to be copied and cleared, dynamically map other VM’s page table BOs for updates, and identity map the entire device’s VRAM with 1 GB pages.”…”�”}”(hhÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:7: ./drivers/gpu/drm/xe/xe_migrate_doc.h”h´KhhîubhÞ)�”}”(hXECurrently the page structure consists of 32 physical pages with 16 being reserved for BO mapping during copies and clear, 1 reserved for kernel binds, several pages are needed to setup the identity mappings (exact number based on how many bits of address space the device has), and the rest are reserved user bind operations.”h]”hXECurrently the page structure consists of 32 physical pages with 16 being reserved for BO mapping during copies and clear, 1 reserved for kernel binds, several pages are needed to setup the identity mappings (exact number based on how many bits of address space the device has), and the rest are reserved user bind operations.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:7: ./drivers/gpu/drm/xe/xe_migrate_doc.h”h´KhhîubhÞ)�”}”(hŒTODO: Diagram of layout”h]”hŒTODO: Diagram of layout”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:7: ./drivers/gpu/drm/xe/xe_migrate_doc.h”h´Khhîubeh}”(h]”Œspecial-vm-details”ah ]”h"]”Œspecial vm details”ah$]”h&]”uh1hÈhhÊh²hh³Nh´NubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Bind jobs”h]”hŒ Bind jobs”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj4h³Nh´NubhÞ)�”}”(hŒ·A bind job consist of two batches and runs either on the migrate engine (kernel binds) or the bind engine passed in (user binds). In both cases the VM of the engine is the migrate VM.”h]”hŒ·A bind job consist of two batches and runs either on the migrate engine (kernel binds) or the bind engine passed in (user binds). In both cases the VM of the engine is the migrate VM.”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:7: ./drivers/gpu/drm/xe/xe_migrate_doc.h”h´K!hj4ubhÞ)�”}”(hXoThe first batch is used to update the migration VM page structure to point to the bind VM page table BOs which need to be updated. A physical page is required for this. If it is a user bind, the page is allocated from pool of pages reserved user bind operations with drm_suballoc managing this pool. If it is a kernel bind, the page reserved for kernel binds is used.”h]”hXoThe first batch is used to update the migration VM page structure to point to the bind VM page table BOs which need to be updated. A physical page is required for this. If it is a user bind, the page is allocated from pool of pages reserved user bind operations with drm_suballoc managing this pool. If it is a kernel bind, the page reserved for kernel binds is used.”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:7: ./drivers/gpu/drm/xe/xe_migrate_doc.h”h´K%hj4ubhÞ)�”}”(hŒ¢The first batch is only required for devices without VRAM as when the device has VRAM the bind VM page table BOs are in VRAM and the identity mapping can be used.”h]”hŒ¢The first batch is only required for devices without VRAM as when the device has VRAM the bind VM page table BOs are in VRAM and the identity mapping can be used.”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:7: ./drivers/gpu/drm/xe/xe_migrate_doc.h”h´K+hj4ubhÞ)�”}”(hŒÆThe second batch is used to program page table updated in the bind VM. Why not just one batch? Well the TLBs need to be invalidated between these two batches and that only can be done from the ring.”h]”hŒÆThe second batch is used to program page table updated in the bind VM. Why not just one batch? Well the TLBs need to be invalidated between these two batches and that only can be done from the ring.”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:7: ./drivers/gpu/drm/xe/xe_migrate_doc.h”h´K/hj4ubhÞ)�”}”(hŒÙWhen the bind job complete, the page allocated is returned the pool of pages reserved for user bind operations if a user bind. No need do this for kernel binds as the reserved kernel page is serially used by each job.”h]”hŒÙWhen the bind job complete, the page allocated is returned the pool of pages reserved for user bind operations if a user bind. No need do this for kernel binds as the reserved kernel page is serially used by each job.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:7: ./drivers/gpu/drm/xe/xe_migrate_doc.h”h´K3hj4ubeh}”(h]”Œ bind-jobs”ah ]”h"]”Œ bind jobs”ah$]”h&]”uh1hÈhhÊh²hh³Nh´NubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒCopy / clear jobs”h]”hŒCopy / clear jobs”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj˜h³Nh´NubhÞ)�”}”(hŒJA copy or clear job consist of two batches and runs on the migrate engine.”h]”hŒJA copy or clear job consist of two batches and runs on the migrate engine.”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:7: ./drivers/gpu/drm/xe/xe_migrate_doc.h”h´K:hj˜ubhÞ)�”}”(hXyLike binds, the first batch is used update the migration VM page structure. In copy jobs, we need to map the source and destination of the BO into page the structure. In clear jobs, we just need to add 1 mapping of BO into the page structure. We use the 16 reserved pages in migration VM for mappings, this gives us a maximum copy size of 16 MB and maximum clear size of 32 MB.”h]”hXyLike binds, the first batch is used update the migration VM page structure. In copy jobs, we need to map the source and destination of the BO into page the structure. In clear jobs, we just need to add 1 mapping of BO into the page structure. We use the 16 reserved pages in migration VM for mappings, this gives us a maximum copy size of 16 MB and maximum clear size of 32 MB.”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œd/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:7: ./drivers/gpu/drm/xe/xe_migrate_doc.h”h´K (skipped on first/last job) postamble: wait on semaphore[seqno + 1] SDI saved ring tail = end of next job LRI RING_TAIL = end of next job (skipped on the last job) pad: MI_NOOP up to ULLS_JOB_SIZE_DW”h]”hXËpreamble: clear semaphore[seqno] (reuse for a later wrap) (skipped on first/last job) postamble: wait on semaphore[seqno + 1] SDI saved ring tail = end of next job LRI RING_TAIL = end of next job (skipped on the last job) pad: MI_NOOP up to ULLS_JOB_SIZE_DW”…”�”}”hjssbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jqh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´KqhjQubhÞ)�”}”(hXìThe preamble clears the current job's semaphore so it can be reused once the seqno space wraps. The postamble is what keeps the engine busy: it blocks on the next job's semaphore, which is only signaled when that job is actually submitted, and then advances the ring tail over it. It advances the saved tail as well as the tail register, keeping the two in step without any help from the CPU, so a context save and restore can not rewind the tail behind work which has already been published.”h]”hXðThe preamble clears the current job’s semaphore so it can be reused once the seqno space wraps. The postamble is what keeps the engine busy: it blocks on the next job’s semaphore, which is only signaled when that job is actually submitted, and then advances the ring tail over it. It advances the saved tail as well as the tail register, keeping the two in step without any help from the CPU, so a context save and restore can not rewind the tail behind work which has already been published.”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´K{hjQubhÞ)�”}”(hX¥The tail register write must be non-posted, i.e. it must not carry MI_LRI_FORCE_POSTED. Posted, the new tail is free to land after the command streamer has already drained the rest of the job, at which point the command streamer sees head == the old tail and parks as though the ring were empty. A parked context can be switched off the hardware, and the fast path below has no H2G with which to ask GuC to bring it back.”h]”hX¥The tail register write must be non-posted, i.e. it must not carry MI_LRI_FORCE_POSTED. Posted, the new tail is free to land after the command streamer has already drained the rest of the job, at which point the command streamer sees head == the old tail and parks as though the ring were empty. A parked context can be switched off the hardware, and the fast path below has no H2G with which to ask GuC to bring it back.”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´KƒhjQubhÞ)�”}”(hX¬The tail must be published after the semaphore wait, not before it. The command streamer fetches ring contents up to the tail while it is parked, so a tail published ahead of the wait lets it fetch the next job's slot before the CPU has written the job there. Once released it then executes the MI_NOOPs it fetched instead of the job, that job's fence never signals, and the engine drains and idles with nothing left to wake it.”h]”hX°The tail must be published after the semaphore wait, not before it. The command streamer fetches ring contents up to the tail while it is parked, so a tail published ahead of the wait lets it fetch the next job’s slot before the CPU has written the job there. Once released it then executes the MI_NOOPs it fetched instead of the job, that job’s fence never signals, and the engine drains and idles with nothing left to wake it.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´KŠhjQubeh}”(h]”Œring-layout-of-a-ulls-job”ah ]”h"]”Œring layout of a ulls job”ah$]”h&]”uh1hÈhhÊh²hh³Nh´NubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSubmission fast path”h]”hŒSubmission fast path”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj·h³Nh´NubhÞ)�”}”(hŒ[In submit_exec_queue() (xe_guc_submit.c), a ULLS job that is not the first one reduces to::”h]”hŒZIn submit_exec_queue() (xe_guc_submit.c), a ULLS job that is not the first one reduces to:”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´K”hj·ubjr)�”}”(hŒDxe_lrc_set_ulls_semaphore(lrc, seqno); release previous job”h]”hŒDxe_lrc_set_ulls_semaphore(lrc, seqno); release previous job”…”�”}”hj×sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jqh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´K—hj·ubhÞ)�”}”(hXbThe XE_GUC_ACTION_SCHED_CONTEXT H2G is suppressed, and so is the write of the saved ring tail: the previous job's postamble is parked on this job's semaphore and publishes this job's tail, both in the tail register and in the context image, as soon as it is released. The semaphore signal is all that is left, and the engine walks straight into this job.”h]”hXhThe XE_GUC_ACTION_SCHED_CONTEXT H2G is suppressed, and so is the write of the saved ring tail: the previous job’s postamble is parked on this job’s semaphore and publishes this job’s tail, both in the tail register and in the context image, as soon as it is released. The semaphore signal is all that is left, and the engine walks straight into this job.”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´K™hj·ubhÞ)�”}”(hXThis does assume the context stays resident for as long as ULLS mode is active. Nothing else is scheduled on the reserved engine, so the only ways off the hardware are the "last" job below, or a reset - and a migration job failing already wedges the device.”h]”hXThis does assume the context stays resident for as long as ULLS mode is active. Nothing else is scheduled on the reserved engine, so the only ways off the hardware are the “lastâ€� job below, or a reset - and a migration job failing already wedges the device.”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´KŸhj·ubeh}”(h]”Œsubmission-fast-path”ah ]”h"]”Œsubmission fast path”ah$]”h&]”uh1hÈhhÊh²hh³Nh´NubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Enter / exit”h]”hŒ Enter / exit”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj h³Nh´NubhÞ)�”}”(hXôxe_migrate_ulls_enter() is called from the page fault handler and from the SVM prefetch path, i.e. exactly where low latency migration matters. It takes a PM runtime reference (the device must not suspend while the engine spins), then submits a "first" ULLS job. That first job carries no batch buffer; it exists only to get the context onto the hardware through the normal GuC path and to leave the engine waiting on the next semaphore, pipelining the GuC/HW context switch out of the critical path.”h]”hXøxe_migrate_ulls_enter() is called from the page fault handler and from the SVM prefetch path, i.e. exactly where low latency migration matters. It takes a PM runtime reference (the device must not suspend while the engine spins), then submits a “firstâ€� ULLS job. That first job carries no batch buffer; it exists only to get the context onto the hardware through the normal GuC path and to leave the engine waiting on the next semaphore, pipelining the GuC/HW context switch out of the critical path.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´K§hj ubhÞ)�”}”(hŒÛNo forcewake reference is required. Nothing in the fast path touches MMIO, and the engine keeps itself awake for as long as it is executing the ring. Not needing host MMIO access is also what lets ULLS run on SRIOV VFs.”h]”hŒÛNo forcewake reference is required. Nothing in the fast path touches MMIO, and the engine keeps itself awake for as long as it is executing the ring. Not needing host MMIO access is also what lets ULLS run on SRIOV VFs.”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´K¯hj ubhÞ)�”}”(hX Keeping an engine spinning costs power, so ULLS is not left enabled indefinitely. Every enter and every ULLS job submission re-arms **xe_migrate.ulls.exit_work** with a ULLS_EXIT_JIFFIES delay. When it fires with the queue idle, it submits a "last" ULLS job - again with no batch buffer and, crucially, with no postamble semaphore wait or tail update - which lets the ring drain so the context can be switched off the hardware. The PM reference is then dropped. If the queue was not idle, the worker simply re-arms itself.”h]”(hŒ„Keeping an engine spinning costs power, so ULLS is not left enabled indefinitely. Every enter and every ULLS job submission re-arms ”…”�”}”(hj;h²hh³Nh´NubhŒstrong”“”)�”}”(hŒ**xe_migrate.ulls.exit_work**”h]”hŒxe_migrate.ulls.exit_work”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChj;ubhXm with a ULLS_EXIT_JIFFIES delay. When it fires with the queue idle, it submits a “lastâ€� ULLS job - again with no batch buffer and, crucially, with no postamble semaphore wait or tail update - which lets the ring drain so the context can be switched off the hardware. The PM reference is then dropped. If the queue was not idle, the worker simply re-arms itself.”…”�”}”(hj;h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´K³hj ubeh}”(h]”Œ enter-exit”ah ]”h"]”Œ enter / exit”ah$]”h&]”uh1hÈhhÊh²hh³Nh´NubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Job state”h]”hŒ Job state”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjfh³Nh´NubhÞ)�”}”(hŒ~The state above is communicated to the ring ops and GuC backend via **xe_sched_job.ulls**, set under **xe_migrate.job_mutex**:”h]”(hŒDThe state above is communicated to the ring ops and GuC backend via ”…”�”}”(hjwh²hh³Nh´NubjD)�”}”(hŒ**xe_sched_job.ulls**”h]”hŒxe_sched_job.ulls”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjwubhŒ , set under ”…”�”}”(hjwh²hh³Nh´NubjD)�”}”(hŒ**xe_migrate.job_mutex**”h]”hŒxe_migrate.job_mutex”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jChjwubhŒ:”…”�”}”(hjwh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´K¿hjfubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ1``ULLS_NONE``: job submitted outside of ULLS mode”h]”hÞ)�”}”(hj³h]”(j¯)�”}”(hŒ ``ULLS_NONE``”h]”hŒ ULLS_NONE”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j®hjµubhŒ$: job submitted outside of ULLS mode”…”�”}”(hjµh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´KÂhj±ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¯hj¬ubj°)�”}”(hŒ)``ULLS_ENTER``: job that enters ULLS mode”h]”hÞ)�”}”(hjÙh]”(j¯)�”}”(hŒ``ULLS_ENTER``”h]”hŒ ULLS_ENTER”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j®hjÛubhŒ: job that enters ULLS mode”…”�”}”(hjÛh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´KÃhj×ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¯hj¬ubj°)�”}”(hŒ1``ULLS_ACTIVE``: job submitted while in ULLS mode”h]”hÞ)�”}”(hjÿh]”(j¯)�”}”(hŒ``ULLS_ACTIVE``”h]”hŒ ULLS_ACTIVE”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j®hjubhŒ": job submitted while in ULLS mode”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´KÄhjýubah}”(h]”h ]”h"]”h$]”h&]”uh1j¯hj¬ubj°)�”}”(hŒ)``ULLS_EXIT``: job that exits ULLS mode ”h]”hÞ)�”}”(hŒ'``ULLS_EXIT``: job that exits ULLS mode”h]”(j¯)�”}”(hŒ ``ULLS_EXIT``”h]”hŒ ULLS_EXIT”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j®hj'ubhŒ: job that exits ULLS mode”…”�”}”(hj'h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³Œa/var/lib/git/docbuild/linux/Documentation/gpu/xe/xe_migrate:10: ./drivers/gpu/drm/xe/xe_migrate.c”h´KÅhj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¯hj¬ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jªh³jÐh´KÂhjfubeh}”(h]”Œ job-state”ah ]”h"]”Œ job state”ah$]”h&]”uh1hÈhhÊh²hh³Nh´Nubeh}”(h]”Œ migrate-layer”ah ]”h"]”Œ migrate layer”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j…Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j_j\j1j.j•j’jêjçj?j<jÎjËjjjNjKj´j±j jjcj`jWjTuŒ nametypes”}”(j_‰j1‰j•‰jê‰j?‰jΉj‰jN‰j´‰j ‰jc‰jW‰uh}”(j\hÊj.hîj’j4jçj˜j<jíjËj†jjÑjKjj±jQjj·j`j jTjfuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.