[PATCH 10/18] drm/amdkfd: CRIU restore queue ids

Felix Kuehling felix.kuehling at amd.com
Mon Aug 23 18:29:52 UTC 2021


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 at amd.com>
> Signed-off-by: David Yat Sin <david.yatsin at amd.com>
> ---
>  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;
>  


More information about the amd-gfx mailing list