All of lore.kernel.org
 help / color / mirror / Atom feed
From: Felix Kuehling <felix.kuehling-5C7GfCeVMHo@public.gmane.org>
To: christian.koenig-5C7GfCeVMHo@public.gmane.org,
	amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org,
	Harish Kasiviswanathan
	<harish.kasiviswanathan-5C7GfCeVMHo@public.gmane.org>
Cc: oded.gabbay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org
Subject: Re: [PATCH 06/25] drm/amdgpu: Add KFD eviction fence
Date: Mon, 29 Jan 2018 14:39:45 -0500	[thread overview]
Message-ID: <d864b662-2212-4aa6-2dac-f0ee3157681e@amd.com> (raw)
In-Reply-To: <fa409dd6-6a4e-ea4b-6570-9b16ed4cb4a4-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

On 2018-01-29 08:43 AM, Christian König wrote:
> Hi Felix & Harish,
>
> maybe explain why I found that odd: dma_fence_add_callback() sets the
> DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT flag before adding the callback.
>
> So the flag should always be set when there are callbacks.
> Did I miss anything?

I don't think we add any callbacks to our eviction fences.

Regards,
  Felix

>
> Regards,
> Christian.
>
> Am 29.01.2018 um 00:55 schrieb Felix Kuehling:
>> [+Harish, forgot to acknowledge him in the commit description, will fix
>> that in v2]
>>
>> Harish, please see Christian's question below in amd_kfd_fence_signal.
>> Did I understand this correctly?
>>
>> Regards,
>>    Felix
>>
>> On 2018-01-28 06:42 PM, Felix Kuehling wrote:
>>> On 2018-01-27 04:16 AM, Christian König wrote:
>>>> Am 27.01.2018 um 02:09 schrieb Felix Kuehling:
>>> [snip]
>>>>> +struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context,
>>>>> +                               void *mm)
>>>>> +{
>>>>> +    struct amdgpu_amdkfd_fence *fence = NULL;
>>>>> +
>>>>> +    fence = kzalloc(sizeof(*fence), GFP_KERNEL);
>>>>> +    if (fence == NULL)
>>>>> +        return NULL;
>>>>> +
>>>>> +    /* mm_struct mm is used as void pointer to identify the parent
>>>>> +     * KFD process. Don't dereference it. Fence and any threads
>>>>> using
>>>>> +     * mm is guranteed to be released before process termination.
>>>>> +     */
>>>>> +    fence->mm = mm;
>>>> That won't work. Fences can live much longer than any process who
>>>> created them.
>>>>
>>>> I've already found a fence in a BO still living hours after the
>>>> process was killed and the pid long recycled.
>>>>
>>>> I suggest to make fence->mm a real mm_struct pointer with reference
>>>> counting and then set it to NULL and drop the reference in
>>>> enable_signaling.
>>> I agree. But enable_signaling may be too early to drop the reference.
>>> amd_kfd_fence_check_mm could still be called later from
>>> amdgpu_ttm_bo_eviction_valuable, as long as the fence hasn't
>>> signaled yet.
>>>
>>> The safe place is problably in amd_kfd_fence_release.
>>>
>>>>> +    get_task_comm(fence->timeline_name, current);
>>>>> +    spin_lock_init(&fence->lock);
>>>>> +
>>>>> +    dma_fence_init(&fence->base, &amd_kfd_fence_ops, &fence->lock,
>>>>> +           context, atomic_inc_return(&fence_seq));
>>>>> +
>>>>> +    return fence;
>>>>> +}
>>>>> +
>>>>> +struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct
>>>>> dma_fence *f)
>>>>> +{
>>>>> +    struct amdgpu_amdkfd_fence *fence;
>>>>> +
>>>>> +    if (!f)
>>>>> +        return NULL;
>>>>> +
>>>>> +    fence = container_of(f, struct amdgpu_amdkfd_fence, base);
>>>>> +    if (fence && f->ops == &amd_kfd_fence_ops)
>>>>> +        return fence;
>>>>> +
>>>>> +    return NULL;
>>>>> +}
>>>>> +
>>>>> +static const char *amd_kfd_fence_get_driver_name(struct dma_fence
>>>>> *f)
>>>>> +{
>>>>> +    return "amdgpu_amdkfd_fence";
>>>>> +}
>>>>> +
>>>>> +static const char *amd_kfd_fence_get_timeline_name(struct
>>>>> dma_fence *f)
>>>>> +{
>>>>> +    struct amdgpu_amdkfd_fence *fence = to_amdgpu_amdkfd_fence(f);
>>>>> +
>>>>> +    return fence->timeline_name;
>>>>> +}
>>>>> +
>>>>> +/**
>>>>> + * amd_kfd_fence_enable_signaling - This gets called when TTM wants
>>>>> to evict
>>>>> + *  a KFD BO and schedules a job to move the BO.
>>>>> + *  If fence is already signaled return true.
>>>>> + *  If fence is not signaled schedule a evict KFD process work item.
>>>>> + */
>>>>> +static bool amd_kfd_fence_enable_signaling(struct dma_fence *f)
>>>>> +{
>>>>> +    struct amdgpu_amdkfd_fence *fence = to_amdgpu_amdkfd_fence(f);
>>>>> +
>>>>> +    if (!fence)
>>>>> +        return false;
>>>>> +
>>>>> +    if (dma_fence_is_signaled(f))
>>>>> +        return true;
>>>>> +
>>>>> +    if (!kgd2kfd->schedule_evict_and_restore_process(
>>>>> +                (struct mm_struct *)fence->mm, f))
>>>>> +        return true;
>>>>> +
>>>>> +    return false;
>>>>> +}
>>>>> +
>>>>> +static int amd_kfd_fence_signal(struct dma_fence *f)
>>>>> +{
>>>>> +    unsigned long flags;
>>>>> +    int ret;
>>>>> +
>>>>> +    spin_lock_irqsave(f->lock, flags);
>>>>> +    /* Set enabled bit so cb will called */
>>>>> +    set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &f->flags);
>>>> Mhm, why is that necessary?
>>> This only gets called from fence_release below. I think this is to
>>> avoid
>>> needlessly scheduling an eviction/restore cycle when an eviction fence
>>> gets destroyed that hasn't been triggered before, probably during
>>> process termination.
>>>
>>> Harish, do you remember any other reason for this?
>>>
>>>>> +    ret = dma_fence_signal_locked(f);
>>>>> +    spin_unlock_irqrestore(f->lock, flags);
>>>>> +
>>>>> +    return ret;
>>>>> +}
>>>>> +
>>>>> +/**
>>>>> + * amd_kfd_fence_release - callback that fence can be freed
>>>>> + *
>>>>> + * @fence: fence
>>>>> + *
>>>>> + * This function is called when the reference count becomes zero.
>>>>> + * It just RCU schedules freeing up the fence.
>>>>> + */
>>>>> +static void amd_kfd_fence_release(struct dma_fence *f)
>>>>> +{
>>>>> +    struct amdgpu_amdkfd_fence *fence = to_amdgpu_amdkfd_fence(f);
>>>>> +    /* Unconditionally signal the fence. The process is getting
>>>>> +     * terminated.
>>>>> +     */
>>>>> +    if (WARN_ON(!fence))
>>>>> +        return; /* Not an amdgpu_amdkfd_fence */
>>>>> +
>>>>> +    amd_kfd_fence_signal(f);
>>>>> +    kfree_rcu(f, rcu);
>>>>> +}
>>>>> +
>>>>> +/**
>>>>> + * amd_kfd_fence_check_mm - Check if @mm is same as that of the
>>>>> fence @f
>>>>> + *  if same return TRUE else return FALSE.
>>>>> + *
>>>>> + * @f: [IN] fence
>>>>> + * @mm: [IN] mm that needs to be verified
>>>>> + */
>>>>> +bool amd_kfd_fence_check_mm(struct dma_fence *f, void *mm)
>>>>> +{
>>>>> +    struct amdgpu_amdkfd_fence *fence = to_amdgpu_amdkfd_fence(f);
>>>>> +
>>>>> +    if (!fence)
>>>>> +        return false;
>>>>> +    else if (fence->mm == mm)
>>>>> +        return true;
>>>>> +
>>>>> +    return false;
>>>>> +}
>>>>> +
>>>>> +const struct dma_fence_ops amd_kfd_fence_ops = {
>>>>> +    .get_driver_name = amd_kfd_fence_get_driver_name,
>>>>> +    .get_timeline_name = amd_kfd_fence_get_timeline_name,
>>>>> +    .enable_signaling = amd_kfd_fence_enable_signaling,
>>>>> +    .signaled = NULL,
>>>>> +    .wait = dma_fence_default_wait,
>>>>> +    .release = amd_kfd_fence_release,
>>>>> +};
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>>>>> index 65d5a4e..ca00dd2 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>>>>> @@ -36,8 +36,9 @@
>>>>>    #define AMDGPU_MAX_UVD_ENC_RINGS    2
>>>>>      /* some special values for the owner field */
>>>>> -#define AMDGPU_FENCE_OWNER_UNDEFINED    ((void*)0ul)
>>>>> -#define AMDGPU_FENCE_OWNER_VM        ((void*)1ul)
>>>>> +#define AMDGPU_FENCE_OWNER_UNDEFINED    ((void *)0ul)
>>>>> +#define AMDGPU_FENCE_OWNER_VM        ((void *)1ul)
>>>>> +#define AMDGPU_FENCE_OWNER_KFD        ((void *)2ul)
>>>>>      #define AMDGPU_FENCE_FLAG_64BIT         (1 << 0)
>>>>>    #define AMDGPU_FENCE_FLAG_INT           (1 << 1)
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
>>>>> index df65c66..0cb31d9 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c
>>>>> @@ -31,6 +31,7 @@
>>>>>    #include <drm/drmP.h>
>>>>>    #include "amdgpu.h"
>>>>>    #include "amdgpu_trace.h"
>>>>> +#include "amdgpu_amdkfd.h"
>>>>>      struct amdgpu_sync_entry {
>>>>>        struct hlist_node    node;
>>>>> @@ -86,10 +87,18 @@ static bool amdgpu_sync_same_dev(struct
>>>>> amdgpu_device *adev,
>>>>>    static void *amdgpu_sync_get_owner(struct dma_fence *f)
>>>>>    {
>>>>>        struct drm_sched_fence *s_fence = to_drm_sched_fence(f);
>>>>> +    struct amdgpu_amdkfd_fence *kfd_fence;
>>>>> +
>>>>> +    if (!f)
>>>>> +        return AMDGPU_FENCE_OWNER_UNDEFINED;
>>>> When you add the extra NULL check here then please move the
>>>> to_drm_sched_fence() after it as well.
>>> Yeah, makes sense.
>>>
>>> Regards,
>>>    Felix
>>>
>>>> Christian.
>>>>
>>>>>          if (s_fence)
>>>>>            return s_fence->owner;
>>>>>    +    kfd_fence = to_amdgpu_amdkfd_fence(f);
>>>>> +    if (kfd_fence)
>>>>> +        return AMDGPU_FENCE_OWNER_KFD;
>>>>> +
>>>>>        return AMDGPU_FENCE_OWNER_UNDEFINED;
>>>>>    }
>>>>>    @@ -204,11 +213,18 @@ int amdgpu_sync_resv(struct amdgpu_device
>>>>> *adev,
>>>>>        for (i = 0; i < flist->shared_count; ++i) {
>>>>>            f = rcu_dereference_protected(flist->shared[i],
>>>>>                              reservation_object_held(resv));
>>>>> +        /* We only want to trigger KFD eviction fences on
>>>>> +         * evict or move jobs. Skip KFD fences otherwise.
>>>>> +         */
>>>>> +        fence_owner = amdgpu_sync_get_owner(f);
>>>>> +        if (fence_owner == AMDGPU_FENCE_OWNER_KFD &&
>>>>> +            owner != AMDGPU_FENCE_OWNER_UNDEFINED)
>>>>> +            continue;
>>>>> +
>>>>>            if (amdgpu_sync_same_dev(adev, f)) {
>>>>>                /* VM updates are only interesting
>>>>>                 * for other VM updates and moves.
>>>>>                 */
>>>>> -            fence_owner = amdgpu_sync_get_owner(f);
>>>>>                if ((owner != AMDGPU_FENCE_OWNER_UNDEFINED) &&
>>>>>                    (fence_owner != AMDGPU_FENCE_OWNER_UNDEFINED) &&
>>>>>                    ((owner == AMDGPU_FENCE_OWNER_VM) !=
>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>>>> index e4bb435..c3f33d3 100644
>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>>>> @@ -46,6 +46,7 @@
>>>>>    #include "amdgpu.h"
>>>>>    #include "amdgpu_object.h"
>>>>>    #include "amdgpu_trace.h"
>>>>> +#include "amdgpu_amdkfd.h"
>>>>>    #include "bif/bif_4_1_d.h"
>>>>>      #define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT)
>>>>> @@ -1170,6 +1171,23 @@ static bool
>>>>> amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
>>>>>    {
>>>>>        unsigned long num_pages = bo->mem.num_pages;
>>>>>        struct drm_mm_node *node = bo->mem.mm_node;
>>>>> +    struct reservation_object_list *flist;
>>>>> +    struct dma_fence *f;
>>>>> +    int i;
>>>>> +
>>>>> +    /* If bo is a KFD BO, check if the bo belongs to the current
>>>>> process.
>>>>> +     * If true, then return false as any KFD process needs all its
>>>>> BOs to
>>>>> +     * be resident to run successfully
>>>>> +     */
>>>>> +    flist = reservation_object_get_list(bo->resv);
>>>>> +    if (flist) {
>>>>> +        for (i = 0; i < flist->shared_count; ++i) {
>>>>> +            f = rcu_dereference_protected(flist->shared[i],
>>>>> +                reservation_object_held(bo->resv));
>>>>> +            if (amd_kfd_fence_check_mm(f, current->mm))
>>>>> +                return false;
>>>>> +        }
>>>>> +    }
>>>>>          switch (bo->mem.mem_type) {
>>>>>        case TTM_PL_TT:
>>>>> diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
>>>>> b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
>>>>> index 94eab54..9e35249 100644
>>>>> --- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
>>>>> +++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h
>>>>> @@ -30,6 +30,7 @@
>>>>>      #include <linux/types.h>
>>>>>    #include <linux/bitmap.h>
>>>>> +#include <linux/dma-fence.h>
>>>>>      struct pci_dev;
>>>>>    @@ -286,6 +287,9 @@ struct kfd2kgd_calls {
>>>>>     *
>>>>>     * @resume: Notifies amdkfd about a resume action done to a kgd
>>>>> device
>>>>>     *
>>>>> + * @schedule_evict_and_restore_process: Schedules work queue that
>>>>> will prepare
>>>>> + * for safe eviction of KFD BOs that belong to the specified
>>>>> process.
>>>>> + *
>>>>>     * This structure contains function callback pointers so the kgd
>>>>> driver
>>>>>     * will notify to the amdkfd about certain status changes.
>>>>>     *
>>>>> @@ -300,6 +304,8 @@ struct kgd2kfd_calls {
>>>>>        void (*interrupt)(struct kfd_dev *kfd, const void
>>>>> *ih_ring_entry);
>>>>>        void (*suspend)(struct kfd_dev *kfd);
>>>>>        int (*resume)(struct kfd_dev *kfd);
>>>>> +    int (*schedule_evict_and_restore_process)(struct mm_struct *mm,
>>>>> +            struct dma_fence *fence);
>>>>>    };
>>>>>      int kgd2kfd_init(unsigned interface_version,
>> _______________________________________________
>> amd-gfx mailing list
>> amd-gfx@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
>

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

  parent reply	other threads:[~2018-01-29 19:39 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-27  1:09 [PATCH 00/25] Add KFD GPUVM support for dGPUs Felix Kuehling
     [not found] ` <1517015381-1080-1-git-send-email-Felix.Kuehling-5C7GfCeVMHo@public.gmane.org>
2018-01-27  1:09   ` [PATCH 01/25] drm/amdgpu: remove useless BUG_ONs Felix Kuehling
2018-01-27  1:09   ` [PATCH 02/25] drm/amdgpu: Replace kgd_mem with amdgpu_bo for kernel pinned gtt mem Felix Kuehling
2018-01-27  1:09   ` [PATCH 03/25] drm/amdgpu: Fix header file dependencies Felix Kuehling
2018-01-27  1:09   ` [PATCH 04/25] drm/amdgpu: Fix wrong mask in get_atc_vmid_pasid_mapping_pasid Felix Kuehling
2018-01-27  1:09   ` [PATCH 05/25] drm/amdgpu: Remove unused kfd2kgd interface Felix Kuehling
2018-01-27  1:09   ` [PATCH 06/25] drm/amdgpu: Add KFD eviction fence Felix Kuehling
     [not found]     ` <1517015381-1080-7-git-send-email-Felix.Kuehling-5C7GfCeVMHo@public.gmane.org>
2018-01-27  9:16       ` Christian König
     [not found]         ` <11f5f33b-0c0e-44c2-5be9-5d0d25204c2e-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-01-28 23:42           ` Felix Kuehling
     [not found]             ` <05cc2831-a338-ddae-42c5-8be381787a5e-5C7GfCeVMHo@public.gmane.org>
2018-01-28 23:55               ` Felix Kuehling
     [not found]                 ` <9697c103-f6cd-b7c9-a0a1-5f9ff080f789-5C7GfCeVMHo@public.gmane.org>
2018-01-29 13:43                   ` Christian König
     [not found]                     ` <fa409dd6-6a4e-ea4b-6570-9b16ed4cb4a4-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-01-29 19:39                       ` Felix Kuehling [this message]
     [not found]                         ` <d864b662-2212-4aa6-2dac-f0ee3157681e-5C7GfCeVMHo@public.gmane.org>
2018-01-30 15:28                           ` Kasiviswanathan, Harish
     [not found]                             ` <DM3PR1201MB103814597E6C7DB4632E278E8CE40-BBcFnVpqZhWjUUTFdQAMQmrFom/aUZj6nBOFsp37pqbUKgpGm//BTAC/G2K4zDHf@public.gmane.org>
2018-01-30 15:35                               ` Christian König
     [not found]                                 ` <a1c8d096-4cf5-0f36-b0d1-8ed705ba7fb2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-01-30 23:21                                   ` Felix Kuehling
     [not found]                                     ` <cffd64a9-7222-7f9f-4fe8-e37972de9fd9-5C7GfCeVMHo@public.gmane.org>
2018-01-31  8:09                                       ` Christian König
2018-01-27  1:09   ` [PATCH 07/25] drm/amdgpu: Update kgd2kfd_shared_resources for dGPU support Felix Kuehling
     [not found]     ` <1517015381-1080-8-git-send-email-Felix.Kuehling-5C7GfCeVMHo@public.gmane.org>
2018-01-27  9:19       ` Christian König
     [not found]         ` <de92f17a-5278-1b55-2a22-af17a82f7471-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-01-28 23:02           ` Felix Kuehling
     [not found]             ` <7425b235-e354-e9b7-0b83-623d9148c61b-5C7GfCeVMHo@public.gmane.org>
2018-01-29 11:42               ` Christian König
     [not found]                 ` <37bf2205-ca7c-f441-1759-48f2d854dea5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2018-01-29 20:25                   ` Felix Kuehling
     [not found]                     ` <4aefa3bc-66b3-5e39-26e6-cc7c1e66adbd-5C7GfCeVMHo@public.gmane.org>
2018-01-30  9:13                       ` Christian König
2018-01-27  1:09   ` [PATCH 08/25] drm/amdgpu: add amdgpu_sync_clone Felix Kuehling
2018-01-27  1:09   ` [PATCH 09/25] drm/amdgpu: Add GPUVM memory management functions for KFD Felix Kuehling
2018-01-27  1:09   ` [PATCH 10/25] drm/amdgpu: Add submit IB function " Felix Kuehling
2018-01-27  1:09   ` [PATCH 11/25] drm/amdkfd: Add missing #ifdef CONFIG_AMD_IOMMU_V2 guard Felix Kuehling
2018-01-27  1:09   ` [PATCH 12/25] drm/amdkfd: Use per-device sched_policy Felix Kuehling
2018-01-27  1:09   ` [PATCH 13/25] drm/amdkfd: Remove unaligned memory access Felix Kuehling
2018-01-27  1:09   ` [PATCH 14/25] drm/amdkfd: Populate DRM render device minor Felix Kuehling
2018-01-27  1:09   ` [PATCH 15/25] drm/amdkfd: Add GPUVM virtual address space to PDD Felix Kuehling
2018-01-27  1:09   ` [PATCH 16/25] drm/amdkfd: Implement KFD process eviction/restore Felix Kuehling
2018-01-27  1:09   ` [PATCH 17/25] uapi: Fix type used in ioctl parameter structures Felix Kuehling
2018-01-27  1:09   ` [PATCH 18/25] drm/amdkfd: Remove limit on number of GPUs Felix Kuehling
2018-01-27  1:09   ` [PATCH 19/25] drm/amdkfd: Aperture setup for dGPUs Felix Kuehling
2018-01-27  1:09   ` [PATCH 20/25] drm/amdkfd: Add per-process IDR for buffer handles Felix Kuehling
2018-01-27  1:09   ` [PATCH 21/25] drm/amdkfd: Allocate CWSR trap handler memory for dGPUs Felix Kuehling
2018-01-27  1:09   ` [PATCH 22/25] drm/amdkfd: Add TC flush on VMID deallocation for Hawaii Felix Kuehling
2018-01-27  1:09   ` [PATCH 23/25] drm/amdkfd: Add ioctls for GPUVM memory management Felix Kuehling
2018-01-27  1:09   ` [PATCH 24/25] drm/amdkfd: Kmap event page for dGPUs Felix Kuehling
2018-01-27  1:09   ` [PATCH 25/25] drm/amdkfd: Add module option for testing large-BAR functionality Felix Kuehling
2018-01-27  9:08   ` [PATCH 00/25] Add KFD GPUVM support for dGPUs Christian König
2018-02-07  1:32 [PATCH 00/25] Add KFD GPUVM support for dGPUs v2 Felix Kuehling
     [not found] ` <1517967174-21709-1-git-send-email-Felix.Kuehling-5C7GfCeVMHo@public.gmane.org>
2018-02-07  1:32   ` [PATCH 06/25] drm/amdgpu: Add KFD eviction fence Felix Kuehling
     [not found]     ` <1517967174-21709-7-git-send-email-Felix.Kuehling-5C7GfCeVMHo@public.gmane.org>
2018-02-11 12:42       ` Oded Gabbay
2018-02-12 19:19         ` Felix Kuehling

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d864b662-2212-4aa6-2dac-f0ee3157681e@amd.com \
    --to=felix.kuehling-5c7gfcevmho@public.gmane.org \
    --cc=amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org \
    --cc=christian.koenig-5C7GfCeVMHo@public.gmane.org \
    --cc=harish.kasiviswanathan-5C7GfCeVMHo@public.gmane.org \
    --cc=oded.gabbay-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.