Am 2021-08-19 um 9:37 a.m. schrieb David Yat Sin: > When re-creating queues during CRIU restore, restore the queue with the > same queue id value used during CRIU dump. Adding a new private > structure queue_restore_data to store queue restore information. The sentence about the queue_restore_data structure is outdated. Regards, Felix > > Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@xxxxxxx> > Signed-off-by: David Yat Sin <david.yatsin@xxxxxxx> > --- > drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 4 ++-- > drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c | 2 +- > drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 2 ++ > .../amd/amdkfd/kfd_process_queue_manager.c | 22 ++++++++++++++++++- > 4 files changed, 26 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c > index 6f1c9fb8d46c..813ed42e3ce6 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c > @@ -312,7 +312,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p, > p->pasid, > dev->id); > > - err = pqm_create_queue(&p->pqm, dev, filep, &q_properties, &queue_id, > + err = pqm_create_queue(&p->pqm, dev, filep, &q_properties, &queue_id, NULL, > &doorbell_offset_in_process); > if (err != 0) > goto err_create_queue; > @@ -2543,7 +2543,7 @@ static int criu_restore_queue(struct kfd_process *p, > > print_queue_properties(&qp); > > - ret = pqm_create_queue(&p->pqm, dev, NULL, &qp, &queue_id, NULL); > + ret = pqm_create_queue(&p->pqm, dev, NULL, &qp, &queue_id, q_data, NULL); > if (ret) { > pr_err("Failed to create new queue err:%d\n", ret); > ret = -EINVAL; > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c b/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c > index 159add0f5aaa..749a7a3bf191 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c > @@ -185,7 +185,7 @@ static int dbgdev_register_diq(struct kfd_dbgdev *dbgdev) > properties.type = KFD_QUEUE_TYPE_DIQ; > > status = pqm_create_queue(dbgdev->pqm, dbgdev->dev, NULL, > - &properties, &qid, NULL); > + &properties, &qid, NULL, NULL); > > if (status) { > pr_err("Failed to create DIQ\n"); > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h > index 4b4808b191f2..eaf5fe1480e9 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h > @@ -468,6 +468,7 @@ enum KFD_QUEUE_PRIORITY { > * it's user mode or kernel mode queue. > * > */ > + > struct queue_properties { > enum kfd_queue_type type; > enum kfd_queue_format format; > @@ -1114,6 +1115,7 @@ int pqm_create_queue(struct process_queue_manager *pqm, > struct file *f, > struct queue_properties *properties, > unsigned int *qid, > + const struct kfd_criu_queue_priv_data *q_data, > uint32_t *p_doorbell_offset_in_process); > int pqm_destroy_queue(struct process_queue_manager *pqm, unsigned int qid); > int pqm_update_queue(struct process_queue_manager *pqm, unsigned int qid, > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c > index 95a6c36cea4c..e6abab16b8de 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c > @@ -42,6 +42,20 @@ static inline struct process_queue_node *get_queue_by_qid( > return NULL; > } > > +static int assign_queue_slot_by_qid(struct process_queue_manager *pqm, > + unsigned int qid) > +{ > + if (qid >= KFD_MAX_NUM_OF_QUEUES_PER_PROCESS) > + return -EINVAL; > + > + if (__test_and_set_bit(qid, pqm->queue_slot_bitmap)) { > + pr_err("Cannot create new queue because requested qid(%u) is in use\n", qid); > + return -ENOSPC; > + } > + > + return 0; > +} > + > static int find_available_queue_slot(struct process_queue_manager *pqm, > unsigned int *qid) > { > @@ -193,6 +207,7 @@ int pqm_create_queue(struct process_queue_manager *pqm, > struct file *f, > struct queue_properties *properties, > unsigned int *qid, > + const struct kfd_criu_queue_priv_data *q_data, > uint32_t *p_doorbell_offset_in_process) > { > int retval; > @@ -224,7 +239,12 @@ int pqm_create_queue(struct process_queue_manager *pqm, > if (pdd->qpd.queue_count >= max_queues) > return -ENOSPC; > > - retval = find_available_queue_slot(pqm, qid); > + if (q_data) { > + retval = assign_queue_slot_by_qid(pqm, q_data->q_id); > + *qid = q_data->q_id; > + } else > + retval = find_available_queue_slot(pqm, qid); > + > if (retval != 0) > return retval; >