I hoped that Dave Airlied will land it together with this patch. As far as I know the closed source driver already doesn't use that any more either. Regards, Christian. Am 11.07.2017 um 11:20 schrieb Mao, David: > Hi Christian, > When will sync object support landed in upstream kernel, which version in specific? > We still rely on legacy semaphore implementation and we have to use it if sync object still takes time. > Thanks. > Best Regards, > David >> On 11 Jul 2017, at 5:15 PM, Christian König <deathsimple at vodafone.de> wrote: >> >> From: Christian König <christian.koenig at amd.com> >> >> This reverts commit 6b79c66b841dded6ffa6b56f14e4eb10a90a7c07 >> and commit 6afadeaf13279fcdbc48999f522e1dc90a9dfdaf. >> >> Semaphore support was never used by any open source project and >> not even widely by any closed source driver. >> >> This should be replaced by sync object support. >> >> Signed-off-by: Christian König <christian.koenig at amd.com> >> --- >> amdgpu/amdgpu.h | 65 ------------- >> amdgpu/amdgpu_cs.c | 237 +---------------------------------------------- >> amdgpu/amdgpu_internal.h | 15 --- >> 3 files changed, 5 insertions(+), 312 deletions(-) >> >> diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h >> index 1901fa8..8bf57a4 100644 >> --- a/amdgpu/amdgpu.h >> +++ b/amdgpu/amdgpu.h >> @@ -128,11 +128,6 @@ typedef struct amdgpu_bo_list *amdgpu_bo_list_handle; >> */ >> typedef struct amdgpu_va *amdgpu_va_handle; >> >> -/** >> - * Define handle for semaphore >> - */ >> -typedef struct amdgpu_semaphore *amdgpu_semaphore_handle; >> - >> /*--------------------------------------------------------------------------*/ >> /* -------------------------- Structures ---------------------------------- */ >> /*--------------------------------------------------------------------------*/ >> @@ -1259,66 +1254,6 @@ int amdgpu_bo_va_op_raw(amdgpu_device_handle dev, >> uint32_t ops); >> >> /** >> - * create semaphore >> - * >> - * \param sem - \c [out] semaphore handle >> - * >> - * \return 0 on success\n >> - * <0 - Negative POSIX Error code >> - * >> -*/ >> -int amdgpu_cs_create_semaphore(amdgpu_semaphore_handle *sem); >> - >> -/** >> - * signal semaphore >> - * >> - * \param context - \c [in] GPU Context >> - * \param ip_type - \c [in] Hardware IP block type = AMDGPU_HW_IP_* >> - * \param ip_instance - \c [in] Index of the IP block of the same type >> - * \param ring - \c [in] Specify ring index of the IP >> - * \param sem - \c [in] semaphore handle >> - * >> - * \return 0 on success\n >> - * <0 - Negative POSIX Error code >> - * >> -*/ >> -int amdgpu_cs_signal_semaphore(amdgpu_context_handle ctx, >> - uint32_t ip_type, >> - uint32_t ip_instance, >> - uint32_t ring, >> - amdgpu_semaphore_handle sem); >> - >> -/** >> - * wait semaphore >> - * >> - * \param context - \c [in] GPU Context >> - * \param ip_type - \c [in] Hardware IP block type = AMDGPU_HW_IP_* >> - * \param ip_instance - \c [in] Index of the IP block of the same type >> - * \param ring - \c [in] Specify ring index of the IP >> - * \param sem - \c [in] semaphore handle >> - * >> - * \return 0 on success\n >> - * <0 - Negative POSIX Error code >> - * >> -*/ >> -int amdgpu_cs_wait_semaphore(amdgpu_context_handle ctx, >> - uint32_t ip_type, >> - uint32_t ip_instance, >> - uint32_t ring, >> - amdgpu_semaphore_handle sem); >> - >> -/** >> - * destroy semaphore >> - * >> - * \param sem - \c [in] semaphore handle >> - * >> - * \return 0 on success\n >> - * <0 - Negative POSIX Error code >> - * >> -*/ >> -int amdgpu_cs_destroy_semaphore(amdgpu_semaphore_handle sem); >> - >> -/** >> * Get the ASIC marketing name >> * >> * \param dev - \c [in] Device handle. See #amdgpu_device_initialize() >> diff --git a/amdgpu/amdgpu_cs.c b/amdgpu/amdgpu_cs.c >> index 868eb7b..c0794d2 100644 >> --- a/amdgpu/amdgpu_cs.c >> +++ b/amdgpu/amdgpu_cs.c >> @@ -40,9 +40,6 @@ >> #include "amdgpu_drm.h" >> #include "amdgpu_internal.h" >> >> -static int amdgpu_cs_unreference_sem(amdgpu_semaphore_handle sem); >> -static int amdgpu_cs_reset_sem(amdgpu_semaphore_handle sem); >> - >> /** >> * Create command submission context >> * >> @@ -56,7 +53,6 @@ int amdgpu_cs_ctx_create(amdgpu_device_handle dev, >> { >> struct amdgpu_context *gpu_context; >> union drm_amdgpu_ctx args; >> - int i, j, k; >> int r; >> >> if (!dev || !context) >> @@ -68,10 +64,6 @@ int amdgpu_cs_ctx_create(amdgpu_device_handle dev, >> >> gpu_context->dev = dev; >> >> - r = pthread_mutex_init(&gpu_context->sequence_mutex, NULL); >> - if (r) >> - goto error; >> - >> /* Create the context */ >> memset(&args, 0, sizeof(args)); >> args.in.op = AMDGPU_CTX_OP_ALLOC_CTX; >> @@ -80,16 +72,11 @@ int amdgpu_cs_ctx_create(amdgpu_device_handle dev, >> goto error; >> >> gpu_context->id = args.out.alloc.ctx_id; >> - for (i = 0; i < AMDGPU_HW_IP_NUM; i++) >> - for (j = 0; j < AMDGPU_HW_IP_INSTANCE_MAX_COUNT; j++) >> - for (k = 0; k < AMDGPU_CS_MAX_RINGS; k++) >> - list_inithead(&gpu_context->sem_list[i][j][k]); >> *context = (amdgpu_context_handle)gpu_context; >> >> return 0; >> >> error: >> - pthread_mutex_destroy(&gpu_context->sequence_mutex); >> free(gpu_context); >> return r; >> } >> @@ -105,32 +92,18 @@ error: >> int amdgpu_cs_ctx_free(amdgpu_context_handle context) >> { >> union drm_amdgpu_ctx args; >> - int i, j, k; >> int r; >> >> if (!context) >> return -EINVAL; >> >> - pthread_mutex_destroy(&context->sequence_mutex); >> - >> /* now deal with kernel side */ >> memset(&args, 0, sizeof(args)); >> args.in.op = AMDGPU_CTX_OP_FREE_CTX; >> args.in.ctx_id = context->id; >> r = drmCommandWriteRead(context->dev->fd, DRM_AMDGPU_CTX, >> &args, sizeof(args)); >> - for (i = 0; i < AMDGPU_HW_IP_NUM; i++) { >> - for (j = 0; j < AMDGPU_HW_IP_INSTANCE_MAX_COUNT; j++) { >> - for (k = 0; k < AMDGPU_CS_MAX_RINGS; k++) { >> - amdgpu_semaphore_handle sem; >> - LIST_FOR_EACH_ENTRY(sem, &context->sem_list[i][j][k], list) { >> - list_del(&sem->list); >> - amdgpu_cs_reset_sem(sem); >> - amdgpu_cs_unreference_sem(sem); >> - } >> - } >> - } >> - } >> + >> free(context); >> >> return r; >> @@ -175,10 +148,7 @@ static int amdgpu_cs_submit_one(amdgpu_context_handle context, >> struct drm_amdgpu_cs_chunk *chunks; >> struct drm_amdgpu_cs_chunk_data *chunk_data; >> struct drm_amdgpu_cs_chunk_dep *dependencies = NULL; >> - struct drm_amdgpu_cs_chunk_dep *sem_dependencies = NULL; >> - struct list_head *sem_list; >> - amdgpu_semaphore_handle sem, tmp; >> - uint32_t i, size, sem_count = 0; >> + uint32_t i, size; >> bool user_fence; >> int r = 0; >> >> @@ -194,7 +164,7 @@ static int amdgpu_cs_submit_one(amdgpu_context_handle context, >> } >> user_fence = (ibs_request->fence_info.handle != NULL); >> >> - size = ibs_request->number_of_ibs + (user_fence ? 2 : 1) + 1; >> + size = ibs_request->number_of_ibs + (user_fence ? 2 : 1); >> >> chunk_array = alloca(sizeof(uint64_t) * size); >> chunks = alloca(sizeof(struct drm_amdgpu_cs_chunk) * size); >> @@ -228,8 +198,6 @@ static int amdgpu_cs_submit_one(amdgpu_context_handle context, >> chunk_data[i].ib_data.flags = ib->flags; >> } >> >> - pthread_mutex_lock(&context->sequence_mutex); >> - >> if (user_fence) { >> i = cs.in.num_chunks++; >> >> @@ -274,49 +242,15 @@ static int amdgpu_cs_submit_one(amdgpu_context_handle context, >> chunks[i].chunk_data = (uint64_t)(uintptr_t)dependencies; >> } >> >> - sem_list = &context->sem_list[ibs_request->ip_type][ibs_request->ip_instance][ibs_request->ring]; >> - LIST_FOR_EACH_ENTRY(sem, sem_list, list) >> - sem_count++; >> - if (sem_count) { >> - sem_dependencies = malloc(sizeof(struct drm_amdgpu_cs_chunk_dep) * sem_count); >> - if (!sem_dependencies) { >> - r = -ENOMEM; >> - goto error_unlock; >> - } >> - sem_count = 0; >> - LIST_FOR_EACH_ENTRY_SAFE(sem, tmp, sem_list, list) { >> - struct amdgpu_cs_fence *info = &sem->signal_fence; >> - struct drm_amdgpu_cs_chunk_dep *dep = &sem_dependencies[sem_count++]; >> - dep->ip_type = info->ip_type; >> - dep->ip_instance = info->ip_instance; >> - dep->ring = info->ring; >> - dep->ctx_id = info->context->id; >> - dep->handle = info->fence; >> - >> - list_del(&sem->list); >> - amdgpu_cs_reset_sem(sem); >> - amdgpu_cs_unreference_sem(sem); >> - } >> - i = cs.in.num_chunks++; >> - >> - /* dependencies chunk */ >> - chunk_array[i] = (uint64_t)(uintptr_t)&chunks[i]; >> - chunks[i].chunk_id = AMDGPU_CHUNK_ID_DEPENDENCIES; >> - chunks[i].length_dw = sizeof(struct drm_amdgpu_cs_chunk_dep) / 4 * sem_count; >> - chunks[i].chunk_data = (uint64_t)(uintptr_t)sem_dependencies; >> - } >> - >> r = drmCommandWriteRead(context->dev->fd, DRM_AMDGPU_CS, >> &cs, sizeof(cs)); >> if (r) >> goto error_unlock; >> >> ibs_request->seq_no = cs.out.handle; >> - context->last_seq[ibs_request->ip_type][ibs_request->ip_instance][ibs_request->ring] = ibs_request->seq_no; >> + >> error_unlock: >> - pthread_mutex_unlock(&context->sequence_mutex); >> free(dependencies); >> - free(sem_dependencies); >> return r; >> } >> >> @@ -429,170 +363,9 @@ int amdgpu_cs_query_fence_status(struct amdgpu_cs_fence *fence, >> fence->ip_instance, fence->ring, >> fence->fence, timeout_ns, flags, &busy); >> >> + >> if (!r && !busy) >> *expired = true; >> >> return r; >> } >> - >> -static int amdgpu_ioctl_wait_fences(struct amdgpu_cs_fence *fences, >> - uint32_t fence_count, >> - bool wait_all, >> - uint64_t timeout_ns, >> - uint32_t *status, >> - uint32_t *first) >> -{ >> - struct drm_amdgpu_fence *drm_fences; >> - amdgpu_device_handle dev = fences[0].context->dev; >> - union drm_amdgpu_wait_fences args; >> - int r; >> - uint32_t i; >> - >> - drm_fences = alloca(sizeof(struct drm_amdgpu_fence) * fence_count); >> - for (i = 0; i < fence_count; i++) { >> - drm_fences[i].ctx_id = fences[i].context->id; >> - drm_fences[i].ip_type = fences[i].ip_type; >> - drm_fences[i].ip_instance = fences[i].ip_instance; >> - drm_fences[i].ring = fences[i].ring; >> - drm_fences[i].seq_no = fences[i].fence; >> - } >> - >> - memset(&args, 0, sizeof(args)); >> - args.in.fences = (uint64_t)(uintptr_t)drm_fences; >> - args.in.fence_count = fence_count; >> - args.in.wait_all = wait_all; >> - args.in.timeout_ns = amdgpu_cs_calculate_timeout(timeout_ns); >> - >> - r = drmIoctl(dev->fd, DRM_IOCTL_AMDGPU_WAIT_FENCES, &args); >> - if (r) >> - return -errno; >> - >> - *status = args.out.status; >> - >> - if (first) >> - *first = args.out.first_signaled; >> - >> - return 0; >> -} >> - >> -int amdgpu_cs_wait_fences(struct amdgpu_cs_fence *fences, >> - uint32_t fence_count, >> - bool wait_all, >> - uint64_t timeout_ns, >> - uint32_t *status, >> - uint32_t *first) >> -{ >> - uint32_t i; >> - >> - /* Sanity check */ >> - if (!fences || !status || !fence_count) >> - return -EINVAL; >> - >> - for (i = 0; i < fence_count; i++) { >> - if (NULL == fences[i].context) >> - return -EINVAL; >> - if (fences[i].ip_type >= AMDGPU_HW_IP_NUM) >> - return -EINVAL; >> - if (fences[i].ring >= AMDGPU_CS_MAX_RINGS) >> - return -EINVAL; >> - } >> - >> - *status = 0; >> - >> - return amdgpu_ioctl_wait_fences(fences, fence_count, wait_all, >> - timeout_ns, status, first); >> -} >> - >> -int amdgpu_cs_create_semaphore(amdgpu_semaphore_handle *sem) >> -{ >> - struct amdgpu_semaphore *gpu_semaphore; >> - >> - if (!sem) >> - return -EINVAL; >> - >> - gpu_semaphore = calloc(1, sizeof(struct amdgpu_semaphore)); >> - if (!gpu_semaphore) >> - return -ENOMEM; >> - >> - atomic_set(&gpu_semaphore->refcount, 1); >> - *sem = gpu_semaphore; >> - >> - return 0; >> -} >> - >> -int amdgpu_cs_signal_semaphore(amdgpu_context_handle ctx, >> - uint32_t ip_type, >> - uint32_t ip_instance, >> - uint32_t ring, >> - amdgpu_semaphore_handle sem) >> -{ >> - if (!ctx || !sem) >> - return -EINVAL; >> - if (ip_type >= AMDGPU_HW_IP_NUM) >> - return -EINVAL; >> - if (ring >= AMDGPU_CS_MAX_RINGS) >> - return -EINVAL; >> - /* sem has been signaled */ >> - if (sem->signal_fence.context) >> - return -EINVAL; >> - pthread_mutex_lock(&ctx->sequence_mutex); >> - sem->signal_fence.context = ctx; >> - sem->signal_fence.ip_type = ip_type; >> - sem->signal_fence.ip_instance = ip_instance; >> - sem->signal_fence.ring = ring; >> - sem->signal_fence.fence = ctx->last_seq[ip_type][ip_instance][ring]; >> - update_references(NULL, &sem->refcount); >> - pthread_mutex_unlock(&ctx->sequence_mutex); >> - return 0; >> -} >> - >> -int amdgpu_cs_wait_semaphore(amdgpu_context_handle ctx, >> - uint32_t ip_type, >> - uint32_t ip_instance, >> - uint32_t ring, >> - amdgpu_semaphore_handle sem) >> -{ >> - if (!ctx || !sem) >> - return -EINVAL; >> - if (ip_type >= AMDGPU_HW_IP_NUM) >> - return -EINVAL; >> - if (ring >= AMDGPU_CS_MAX_RINGS) >> - return -EINVAL; >> - /* must signal first */ >> - if (!sem->signal_fence.context) >> - return -EINVAL; >> - >> - pthread_mutex_lock(&ctx->sequence_mutex); >> - list_add(&sem->list, &ctx->sem_list[ip_type][ip_instance][ring]); >> - pthread_mutex_unlock(&ctx->sequence_mutex); >> - return 0; >> -} >> - >> -static int amdgpu_cs_reset_sem(amdgpu_semaphore_handle sem) >> -{ >> - if (!sem || !sem->signal_fence.context) >> - return -EINVAL; >> - >> - sem->signal_fence.context = NULL;; >> - sem->signal_fence.ip_type = 0; >> - sem->signal_fence.ip_instance = 0; >> - sem->signal_fence.ring = 0; >> - sem->signal_fence.fence = 0; >> - >> - return 0; >> -} >> - >> -static int amdgpu_cs_unreference_sem(amdgpu_semaphore_handle sem) >> -{ >> - if (!sem) >> - return -EINVAL; >> - >> - if (update_references(&sem->refcount, NULL)) >> - free(sem); >> - return 0; >> -} >> - >> -int amdgpu_cs_destroy_semaphore(amdgpu_semaphore_handle sem) >> -{ >> - return amdgpu_cs_unreference_sem(sem); >> -} >> diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h >> index e68246b..8fb7ec6 100644 >> --- a/amdgpu/amdgpu_internal.h >> +++ b/amdgpu/amdgpu_internal.h >> @@ -120,23 +120,8 @@ struct amdgpu_bo_list { >> >> struct amdgpu_context { >> struct amdgpu_device *dev; >> - /** Mutex for accessing fences and to maintain command submissions >> - in good sequence. */ >> - pthread_mutex_t sequence_mutex; >> /* context id*/ >> uint32_t id; >> - uint64_t last_seq[AMDGPU_HW_IP_NUM][AMDGPU_HW_IP_INSTANCE_MAX_COUNT][AMDGPU_CS_MAX_RINGS]; >> - struct list_head sem_list[AMDGPU_HW_IP_NUM][AMDGPU_HW_IP_INSTANCE_MAX_COUNT][AMDGPU_CS_MAX_RINGS]; >> -}; >> - >> -/** >> - * Structure describing sw semaphore based on scheduler >> - * >> - */ >> -struct amdgpu_semaphore { >> - atomic_t refcount; >> - struct list_head list; >> - struct amdgpu_cs_fence signal_fence; >> }; >> >> /** >> -- >> 2.7.4 >> >> _______________________________________________ >> amd-gfx mailing list >> amd-gfx at lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/amd-gfx