From: Daniel Vetter <daniel@ffwll.ch> To: DRI Development <dri-devel@lists.freedesktop.org> Cc: "Thomas Hellström" <thellstrom@vmware.com>, "Daniel Vetter" <daniel.vetter@ffwll.ch>, "Intel Graphics Development" <intel-gfx@lists.freedesktop.org>, "Huang Rui" <ray.huang@amd.com>, "VMware Graphics" <linux-graphics-maintainer@vmware.com>, "Gerd Hoffmann" <kraxel@redhat.com>, "Daniel Vetter" <daniel.vetter@intel.com>, "Christian König" <christian.koenig@amd.com> Subject: Re: [PATCH 3/3] drm/ttm: remove ttm_bo_wait_unreserved Date: Wed, 6 Nov 2019 11:24:43 +0100 [thread overview] Message-ID: <20191106102443.GG23790@phenom.ffwll.local> (raw) In-Reply-To: <20191104173801.2972-3-daniel.vetter@ffwll.ch> On Mon, Nov 04, 2019 at 06:38:01PM +0100, Daniel Vetter wrote: > With nouveau fixed all ttm-using drives have the correct nesting of > mmap_sem vs dma_resv, and we can just lock the buffer. > > Assuming I didn't screw up anything with my audit of course. > > v2: > - Dont forget wu_mutex (Christian König) > - Keep the mmap_sem-less wait optimization (Thomas) > - Use _lock_interruptible to be good citizens (Thomas) > > v3: Rebase over fault handler helperification. > > Reviewed-by: Christian König <christian.koenig@amd.com> (v2) > Reviewed-by: Thomas Hellström <thellstrom@vmware.com> (v2) > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> > Cc: Christian Koenig <christian.koenig@amd.com> > Cc: Huang Rui <ray.huang@amd.com> > Cc: Gerd Hoffmann <kraxel@redhat.com> > Cc: "VMware Graphics" <linux-graphics-maintainer@vmware.com> > Cc: Thomas Hellstrom <thellstrom@vmware.com> Entire series merged into drm-misc-next (probably for 5.6) with Dave's irc-ack for the nouveau patch. -Daniel > --- > drivers/gpu/drm/ttm/ttm_bo.c | 36 ------------------------------- > drivers/gpu/drm/ttm/ttm_bo_util.c | 1 - > drivers/gpu/drm/ttm/ttm_bo_vm.c | 18 +++++----------- > include/drm/ttm/ttm_bo_api.h | 4 ---- > 4 files changed, 5 insertions(+), 54 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c > index 8d91b0428af1..5df596fb0280 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo.c > +++ b/drivers/gpu/drm/ttm/ttm_bo.c > @@ -161,7 +161,6 @@ static void ttm_bo_release_list(struct kref *list_kref) > dma_fence_put(bo->moving); > if (!ttm_bo_uses_embedded_gem_object(bo)) > dma_resv_fini(&bo->base._resv); > - mutex_destroy(&bo->wu_mutex); > bo->destroy(bo); > ttm_mem_global_free(&ttm_mem_glob, acc_size); > } > @@ -1299,7 +1298,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev, > INIT_LIST_HEAD(&bo->ddestroy); > INIT_LIST_HEAD(&bo->swap); > INIT_LIST_HEAD(&bo->io_reserve_lru); > - mutex_init(&bo->wu_mutex); > bo->bdev = bdev; > bo->type = type; > bo->num_pages = num_pages; > @@ -1903,37 +1901,3 @@ void ttm_bo_swapout_all(struct ttm_bo_device *bdev) > while (ttm_bo_swapout(&ttm_bo_glob, &ctx) == 0); > } > EXPORT_SYMBOL(ttm_bo_swapout_all); > - > -/** > - * ttm_bo_wait_unreserved - interruptible wait for a buffer object to become > - * unreserved > - * > - * @bo: Pointer to buffer > - */ > -int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo) > -{ > - int ret; > - > - /* > - * In the absense of a wait_unlocked API, > - * Use the bo::wu_mutex to avoid triggering livelocks due to > - * concurrent use of this function. Note that this use of > - * bo::wu_mutex can go away if we change locking order to > - * mmap_sem -> bo::reserve. > - */ > - ret = mutex_lock_interruptible(&bo->wu_mutex); > - if (unlikely(ret != 0)) > - return -ERESTARTSYS; > - if (!dma_resv_is_locked(bo->base.resv)) > - goto out_unlock; > - ret = dma_resv_lock_interruptible(bo->base.resv, NULL); > - if (ret == -EINTR) > - ret = -ERESTARTSYS; > - if (unlikely(ret != 0)) > - goto out_unlock; > - dma_resv_unlock(bo->base.resv); > - > -out_unlock: > - mutex_unlock(&bo->wu_mutex); > - return ret; > -} > diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c > index 6b0883a1776e..2b0e5a088da0 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo_util.c > +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c > @@ -504,7 +504,6 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo, > INIT_LIST_HEAD(&fbo->base.lru); > INIT_LIST_HEAD(&fbo->base.swap); > INIT_LIST_HEAD(&fbo->base.io_reserve_lru); > - mutex_init(&fbo->base.wu_mutex); > fbo->base.moving = NULL; > drm_vma_node_reset(&fbo->base.base.vma_node); > > diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c > index 11863fbdd5d6..91466cfb6f16 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c > +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c > @@ -128,30 +128,22 @@ static unsigned long ttm_bo_io_mem_pfn(struct ttm_buffer_object *bo, > vm_fault_t ttm_bo_vm_reserve(struct ttm_buffer_object *bo, > struct vm_fault *vmf) > { > - /* > - * Work around locking order reversal in fault / nopfn > - * between mmap_sem and bo_reserve: Perform a trylock operation > - * for reserve, and if it fails, retry the fault after waiting > - * for the buffer to become unreserved. > - */ > if (unlikely(!dma_resv_trylock(bo->base.resv))) { > if (vmf->flags & FAULT_FLAG_ALLOW_RETRY) { > if (!(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) { > ttm_bo_get(bo); > up_read(&vmf->vma->vm_mm->mmap_sem); > - (void) ttm_bo_wait_unreserved(bo); > + if (!dma_resv_lock_interruptible(bo->base.resv, > + NULL)) > + dma_resv_unlock(bo->base.resv); > ttm_bo_put(bo); > } > > return VM_FAULT_RETRY; > } > > - /* > - * If we'd want to change locking order to > - * mmap_sem -> bo::reserve, we'd use a blocking reserve here > - * instead of retrying the fault... > - */ > - return VM_FAULT_NOPAGE; > + if (dma_resv_lock_interruptible(bo->base.resv, NULL)) > + return VM_FAULT_NOPAGE; > } > > return 0; > diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h > index 65e399d280f7..e8b0f0c66059 100644 > --- a/include/drm/ttm/ttm_bo_api.h > +++ b/include/drm/ttm/ttm_bo_api.h > @@ -154,7 +154,6 @@ struct ttm_tt; > * @offset: The current GPU offset, which can have different meanings > * depending on the memory type. For SYSTEM type memory, it should be 0. > * @cur_placement: Hint of current placement. > - * @wu_mutex: Wait unreserved mutex. > * > * Base class for TTM buffer object, that deals with data placement and CPU > * mappings. GPU mappings are really up to the driver, but for simpler GPUs > @@ -222,8 +221,6 @@ struct ttm_buffer_object { > uint64_t offset; /* GPU address space is independent of CPU word size */ > > struct sg_table *sg; > - > - struct mutex wu_mutex; > }; > > /** > @@ -707,7 +704,6 @@ ssize_t ttm_bo_io(struct ttm_bo_device *bdev, struct file *filp, > int ttm_bo_swapout(struct ttm_bo_global *glob, > struct ttm_operation_ctx *ctx); > void ttm_bo_swapout_all(struct ttm_bo_device *bdev); > -int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo); > > /** > * ttm_bo_uses_embedded_gem_object - check if the given bo uses the > -- > 2.24.0.rc2 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
WARNING: multiple messages have this Message-ID (diff)
From: Daniel Vetter <daniel@ffwll.ch> To: DRI Development <dri-devel@lists.freedesktop.org> Cc: "Thomas Hellström" <thellstrom@vmware.com>, "Daniel Vetter" <daniel.vetter@ffwll.ch>, "Intel Graphics Development" <intel-gfx@lists.freedesktop.org>, "Huang Rui" <ray.huang@amd.com>, "VMware Graphics" <linux-graphics-maintainer@vmware.com>, "Gerd Hoffmann" <kraxel@redhat.com>, "Daniel Vetter" <daniel.vetter@intel.com>, "Christian König" <christian.koenig@amd.com> Subject: Re: [Intel-gfx] [PATCH 3/3] drm/ttm: remove ttm_bo_wait_unreserved Date: Wed, 6 Nov 2019 11:24:43 +0100 [thread overview] Message-ID: <20191106102443.GG23790@phenom.ffwll.local> (raw) Message-ID: <20191106102443.VAdOJmo4ESNQq5zsjrGfMOzbd5JsytcDbfq_ffwbYk8@z> (raw) In-Reply-To: <20191104173801.2972-3-daniel.vetter@ffwll.ch> On Mon, Nov 04, 2019 at 06:38:01PM +0100, Daniel Vetter wrote: > With nouveau fixed all ttm-using drives have the correct nesting of > mmap_sem vs dma_resv, and we can just lock the buffer. > > Assuming I didn't screw up anything with my audit of course. > > v2: > - Dont forget wu_mutex (Christian König) > - Keep the mmap_sem-less wait optimization (Thomas) > - Use _lock_interruptible to be good citizens (Thomas) > > v3: Rebase over fault handler helperification. > > Reviewed-by: Christian König <christian.koenig@amd.com> (v2) > Reviewed-by: Thomas Hellström <thellstrom@vmware.com> (v2) > Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> > Cc: Christian Koenig <christian.koenig@amd.com> > Cc: Huang Rui <ray.huang@amd.com> > Cc: Gerd Hoffmann <kraxel@redhat.com> > Cc: "VMware Graphics" <linux-graphics-maintainer@vmware.com> > Cc: Thomas Hellstrom <thellstrom@vmware.com> Entire series merged into drm-misc-next (probably for 5.6) with Dave's irc-ack for the nouveau patch. -Daniel > --- > drivers/gpu/drm/ttm/ttm_bo.c | 36 ------------------------------- > drivers/gpu/drm/ttm/ttm_bo_util.c | 1 - > drivers/gpu/drm/ttm/ttm_bo_vm.c | 18 +++++----------- > include/drm/ttm/ttm_bo_api.h | 4 ---- > 4 files changed, 5 insertions(+), 54 deletions(-) > > diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c > index 8d91b0428af1..5df596fb0280 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo.c > +++ b/drivers/gpu/drm/ttm/ttm_bo.c > @@ -161,7 +161,6 @@ static void ttm_bo_release_list(struct kref *list_kref) > dma_fence_put(bo->moving); > if (!ttm_bo_uses_embedded_gem_object(bo)) > dma_resv_fini(&bo->base._resv); > - mutex_destroy(&bo->wu_mutex); > bo->destroy(bo); > ttm_mem_global_free(&ttm_mem_glob, acc_size); > } > @@ -1299,7 +1298,6 @@ int ttm_bo_init_reserved(struct ttm_bo_device *bdev, > INIT_LIST_HEAD(&bo->ddestroy); > INIT_LIST_HEAD(&bo->swap); > INIT_LIST_HEAD(&bo->io_reserve_lru); > - mutex_init(&bo->wu_mutex); > bo->bdev = bdev; > bo->type = type; > bo->num_pages = num_pages; > @@ -1903,37 +1901,3 @@ void ttm_bo_swapout_all(struct ttm_bo_device *bdev) > while (ttm_bo_swapout(&ttm_bo_glob, &ctx) == 0); > } > EXPORT_SYMBOL(ttm_bo_swapout_all); > - > -/** > - * ttm_bo_wait_unreserved - interruptible wait for a buffer object to become > - * unreserved > - * > - * @bo: Pointer to buffer > - */ > -int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo) > -{ > - int ret; > - > - /* > - * In the absense of a wait_unlocked API, > - * Use the bo::wu_mutex to avoid triggering livelocks due to > - * concurrent use of this function. Note that this use of > - * bo::wu_mutex can go away if we change locking order to > - * mmap_sem -> bo::reserve. > - */ > - ret = mutex_lock_interruptible(&bo->wu_mutex); > - if (unlikely(ret != 0)) > - return -ERESTARTSYS; > - if (!dma_resv_is_locked(bo->base.resv)) > - goto out_unlock; > - ret = dma_resv_lock_interruptible(bo->base.resv, NULL); > - if (ret == -EINTR) > - ret = -ERESTARTSYS; > - if (unlikely(ret != 0)) > - goto out_unlock; > - dma_resv_unlock(bo->base.resv); > - > -out_unlock: > - mutex_unlock(&bo->wu_mutex); > - return ret; > -} > diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c > index 6b0883a1776e..2b0e5a088da0 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo_util.c > +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c > @@ -504,7 +504,6 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo, > INIT_LIST_HEAD(&fbo->base.lru); > INIT_LIST_HEAD(&fbo->base.swap); > INIT_LIST_HEAD(&fbo->base.io_reserve_lru); > - mutex_init(&fbo->base.wu_mutex); > fbo->base.moving = NULL; > drm_vma_node_reset(&fbo->base.base.vma_node); > > diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c b/drivers/gpu/drm/ttm/ttm_bo_vm.c > index 11863fbdd5d6..91466cfb6f16 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c > +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c > @@ -128,30 +128,22 @@ static unsigned long ttm_bo_io_mem_pfn(struct ttm_buffer_object *bo, > vm_fault_t ttm_bo_vm_reserve(struct ttm_buffer_object *bo, > struct vm_fault *vmf) > { > - /* > - * Work around locking order reversal in fault / nopfn > - * between mmap_sem and bo_reserve: Perform a trylock operation > - * for reserve, and if it fails, retry the fault after waiting > - * for the buffer to become unreserved. > - */ > if (unlikely(!dma_resv_trylock(bo->base.resv))) { > if (vmf->flags & FAULT_FLAG_ALLOW_RETRY) { > if (!(vmf->flags & FAULT_FLAG_RETRY_NOWAIT)) { > ttm_bo_get(bo); > up_read(&vmf->vma->vm_mm->mmap_sem); > - (void) ttm_bo_wait_unreserved(bo); > + if (!dma_resv_lock_interruptible(bo->base.resv, > + NULL)) > + dma_resv_unlock(bo->base.resv); > ttm_bo_put(bo); > } > > return VM_FAULT_RETRY; > } > > - /* > - * If we'd want to change locking order to > - * mmap_sem -> bo::reserve, we'd use a blocking reserve here > - * instead of retrying the fault... > - */ > - return VM_FAULT_NOPAGE; > + if (dma_resv_lock_interruptible(bo->base.resv, NULL)) > + return VM_FAULT_NOPAGE; > } > > return 0; > diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h > index 65e399d280f7..e8b0f0c66059 100644 > --- a/include/drm/ttm/ttm_bo_api.h > +++ b/include/drm/ttm/ttm_bo_api.h > @@ -154,7 +154,6 @@ struct ttm_tt; > * @offset: The current GPU offset, which can have different meanings > * depending on the memory type. For SYSTEM type memory, it should be 0. > * @cur_placement: Hint of current placement. > - * @wu_mutex: Wait unreserved mutex. > * > * Base class for TTM buffer object, that deals with data placement and CPU > * mappings. GPU mappings are really up to the driver, but for simpler GPUs > @@ -222,8 +221,6 @@ struct ttm_buffer_object { > uint64_t offset; /* GPU address space is independent of CPU word size */ > > struct sg_table *sg; > - > - struct mutex wu_mutex; > }; > > /** > @@ -707,7 +704,6 @@ ssize_t ttm_bo_io(struct ttm_bo_device *bdev, struct file *filp, > int ttm_bo_swapout(struct ttm_bo_global *glob, > struct ttm_operation_ctx *ctx); > void ttm_bo_swapout_all(struct ttm_bo_device *bdev); > -int ttm_bo_wait_unreserved(struct ttm_buffer_object *bo); > > /** > * ttm_bo_uses_embedded_gem_object - check if the given bo uses the > -- > 2.24.0.rc2 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ Intel-gfx mailing list Intel-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2019-11-06 10:24 UTC|newest] Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-11-04 17:37 [PATCH 1/3] dma_resv: prime lockdep annotations Daniel Vetter 2019-11-04 17:37 ` [Intel-gfx] " Daniel Vetter 2019-11-04 17:37 ` Daniel Vetter [not found] ` <20191104173801.2972-1-daniel.vetter-/w4YWyX8dFk@public.gmane.org> 2019-11-04 17:38 ` [PATCH 2/3] drm/nouveau: slowpath for pushbuf ioctl Daniel Vetter 2019-11-04 17:38 ` [Intel-gfx] " Daniel Vetter 2019-11-04 17:38 ` Daniel Vetter 2019-11-05 11:04 ` Daniel Vetter 2019-11-05 11:04 ` [Intel-gfx] " Daniel Vetter 2019-11-05 11:04 ` Daniel Vetter [not found] ` <20191105110419.GG10326-dv86pmgwkMBes7Z6vYuT8azUEOm+Xw19@public.gmane.org> 2019-11-05 12:30 ` Maarten Lankhorst 2019-11-05 12:30 ` [Intel-gfx] " Maarten Lankhorst 2019-11-05 12:30 ` Maarten Lankhorst 2019-11-04 17:38 ` [PATCH 3/3] drm/ttm: remove ttm_bo_wait_unreserved Daniel Vetter 2019-11-04 17:38 ` [Intel-gfx] " Daniel Vetter 2019-11-06 10:24 ` Daniel Vetter [this message] 2019-11-06 10:24 ` Daniel Vetter 2019-11-04 17:48 ` [PATCH 1/3] dma_resv: prime lockdep annotations Daniel Vetter 2019-11-04 17:48 ` [Intel-gfx] " Daniel Vetter 2019-11-04 17:48 ` Daniel Vetter 2019-11-04 20:01 ` Koenig, Christian 2019-11-04 20:01 ` [Intel-gfx] " Koenig, Christian 2019-11-04 20:01 ` Koenig, Christian 2019-11-04 20:55 ` Daniel Vetter 2019-11-04 20:55 ` [Intel-gfx] " Daniel Vetter 2019-11-04 20:55 ` Daniel Vetter 2019-11-04 21:00 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/3] " Patchwork 2019-11-04 21:00 ` [Intel-gfx] " Patchwork 2019-11-04 21:22 ` ✓ Fi.CI.BAT: success " Patchwork 2019-11-04 21:22 ` [Intel-gfx] " Patchwork 2019-11-05 8:31 ` ✓ Fi.CI.IGT: " Patchwork 2019-11-05 8:31 ` [Intel-gfx] " Patchwork 2019-11-11 13:11 ` [PATCH 1/3] " Steven Price 2019-11-11 13:11 ` [Intel-gfx] " Steven Price 2019-11-11 15:42 ` Daniel Vetter 2019-11-11 15:42 ` [Intel-gfx] " Daniel Vetter 2019-11-11 15:42 ` Daniel Vetter 2019-11-14 11:50 ` Steven Price 2019-11-14 11:50 ` [Intel-gfx] " Steven Price 2019-11-14 11:50 ` Steven Price 2019-11-20 10:51 ` Daniel Vetter 2019-11-20 10:51 ` [Intel-gfx] " Daniel Vetter 2019-11-11 18:12 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/3] dma_resv: prime lockdep annotations (rev2) Patchwork 2019-11-11 18:12 ` [Intel-gfx] " Patchwork 2019-11-11 18:48 ` ✗ Fi.CI.BAT: failure " Patchwork 2019-11-11 18:48 ` [Intel-gfx] " Patchwork -- strict thread matches above, loose matches on Subject: below -- 2019-10-21 14:50 [PATCH 0/3] dma_resv lockdep annotations/priming Daniel Vetter 2019-10-21 14:50 ` [PATCH 3/3] drm/ttm: remove ttm_bo_wait_unreserved Daniel Vetter 2019-08-21 21:50 [PATCH 1/3] dma_resv: prime lockdep annotations Daniel Vetter 2019-08-21 21:50 ` [PATCH 3/3] drm/ttm: remove ttm_bo_wait_unreserved Daniel Vetter 2019-08-20 14:53 [PATCH 0/3] RFC/T: dma_resv vs. mmap_sem Daniel Vetter 2019-08-20 14:53 ` [PATCH 3/3] drm/ttm: remove ttm_bo_wait_unreserved Daniel Vetter 2019-08-20 15:16 ` Koenig, Christian 2019-08-20 15:21 ` Daniel Vetter 2019-08-20 15:34 ` Koenig, Christian 2019-08-20 15:41 ` Daniel Vetter 2019-08-20 15:45 ` Koenig, Christian 2019-08-21 12:40 ` Thomas Hellström (VMware) 2019-08-21 12:47 ` Thomas Hellström (VMware) 2019-08-21 14:09 ` Daniel Vetter 2019-08-21 14:27 ` Thomas Hellström (VMware) 2019-08-21 14:47 ` Daniel Vetter 2019-08-21 15:03 ` Thomas Hellström (VMware) 2019-08-21 15:14 ` Daniel Vetter 2019-08-21 15:19 ` Thomas Hellström (VMware) 2019-08-21 15:22 ` Daniel Vetter 2019-08-21 15:34 ` Thomas Hellström (VMware) 2019-08-21 15:07 ` Koenig, Christian 2019-08-21 13:16 ` Thomas Hellström (VMware) 2019-08-21 14:10 ` Daniel Vetter 2019-08-21 14:30 ` Thomas Hellström (VMware) 2019-08-21 14:42 ` Daniel Vetter
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=20191106102443.GG23790@phenom.ffwll.local \ --to=daniel@ffwll.ch \ --cc=christian.koenig@amd.com \ --cc=daniel.vetter@ffwll.ch \ --cc=daniel.vetter@intel.com \ --cc=dri-devel@lists.freedesktop.org \ --cc=intel-gfx@lists.freedesktop.org \ --cc=kraxel@redhat.com \ --cc=linux-graphics-maintainer@vmware.com \ --cc=ray.huang@amd.com \ --cc=thellstrom@vmware.com \ /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: linkBe 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.