goto exit_unlock;
        }
 
+       /* Confirm all process queues are evicted */
+       if (!p->queues_paused) {
+               pr_err("Cannot dump process when queues are not in evicted state\n");
+               /* CRIU plugin did not call op PROCESS_INFO before checkpointing */
+               ret = -EINVAL;
+               goto exit_unlock;
+       }
+
        criu_get_process_object_info(p, &num_bos, &priv_size);
 
        if (num_bos != args->num_bos ||
                        struct kfd_process *p,
                        struct kfd_ioctl_criu_args *args)
 {
-       return 0;
+       int ret;
+
+       mutex_lock(&p->mutex);
+
+       if (!p->queues_paused) {
+               mutex_unlock(&p->mutex);
+               return -EINVAL;
+       }
+
+       ret = kfd_process_restore_queues(p);
+       if (ret)
+               pr_err("Failed to unpause queues ret:%d\n", ret);
+       else
+               p->queues_paused = false;
+
+       mutex_unlock(&p->mutex);
+
+       return ret;
 }
 
 static int criu_resume(struct file *filep,
                goto err_unlock;
        }
 
+       ret = kfd_process_evict_queues(p);
+       if (ret)
+               goto err_unlock;
+
+       p->queues_paused = true;
+
        args->pid = task_pid_nr_ns(p->lead_thread,
                                        task_active_pid_ns(p->lead_thread));
 
 
        dev_dbg(kfd_device, "Num of bos:%u\n", args->num_bos);
 err_unlock:
+       if (ret) {
+               kfd_process_restore_queues(p);
+               p->queues_paused = false;
+       }
        mutex_unlock(&p->mutex);
        return ret;
 }
 
        process->mm = thread->mm;
        process->lead_thread = thread->group_leader;
        process->n_pdds = 0;
+       process->queues_paused = false;
        INIT_DELAYED_WORK(&process->eviction_work, evict_process_worker);
        INIT_DELAYED_WORK(&process->restore_work, restore_process_worker);
        process->last_restore_timestamp = get_jiffies_64();