{
        struct xe_guc_ct *ct = arg;
 
+       destroy_workqueue(ct->g2h_wq);
        xa_destroy(&ct->fence_lookup);
 }
 
 
        xe_gt_assert(gt, !(guc_ct_size() % PAGE_SIZE));
 
+       ct->g2h_wq = alloc_ordered_workqueue("xe-g2h-wq", 0);
+       if (!ct->g2h_wq)
+               return -ENOMEM;
+
        spin_lock_init(&ct->fast_lock);
        xa_init(&ct->fence_lookup);
        INIT_WORK(&ct->g2h_worker, g2h_worker_func);
 
                return;
 
        wake_up_all(&ct->wq);
-       queue_work(system_unbound_wq, &ct->g2h_worker);
+       queue_work(ct->g2h_wq, &ct->g2h_worker);
        xe_guc_ct_fast_path(ct);
 }
 
 
        wait_queue_head_t wq;
        /** @g2h_fence_wq: wait queue used for G2H fencing */
        wait_queue_head_t g2h_fence_wq;
+       /** @g2h_wq: used to process G2H */
+       struct workqueue_struct *g2h_wq;
        /** @msg: Message buffer */
        u32 msg[GUC_CTB_MSG_MAX_LEN];
        /** @fast_msg: Message buffer */