From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Tomi Sarvela <tomi.p.sarvela@intel.com>,
Chris Wilson <chris@chris-wilson.co.uk>,
Laura Abbott <labbott@redhat.com>,
Sean Paul <seanpaul@chromium.org>,
Matthew Auld <matthew.auld@intel.com>,
Daniel Vetter <daniel.vetter@ffwll.ch>
Subject: [PATCH 4.13 28/47] drm/vgem: Pin our pages for dmabuf exports
Date: Fri, 8 Sep 2017 15:19:00 +0200 [thread overview]
Message-ID: <20170908131824.820433579@linuxfoundation.org> (raw)
In-Reply-To: <20170908131823.546721606@linuxfoundation.org>
4.13-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Wilson <chris@chris-wilson.co.uk>
commit 71bb23c707c141b176bc084179ca5ee58d5fd26a upstream.
When the caller maps their dmabuf and we return an sg_table, the caller
doesn't expect the pages beneath that sg_table to vanish on a whim (i.e.
under mempressure). The contract is that the pages are pinned for the
duration of the mapping (from dma_buf_map_attachment() to
dma_buf_unmap_attachment). To comply, we need to introduce our own
vgem_object.pages_pin_count and elevate it across the mapping. However,
the drm_prime interface we use calls drv->prime_pin on dma_buf_attach
and drv->prime_unpin on dma_buf_detach, which while that does cover the
mapping is much broader than is desired -- but it will do for now.
v2: also hold the pin across prime_vmap/vunmap
Reported-by: Tomi Sarvela <tomi.p.sarvela@intel.com>
Testcase: igt/gem_concurrent_blit/*swap*vgem*
Fixes: 5ba6c9ff961a ("drm/vgem: Fix mmaping")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tomi Sarvela <tomi.p.sarvela@intel.com>
Cc: Laura Abbott <labbott@redhat.com>
Cc: Sean Paul <seanpaul@chromium.org>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: <stable@vger.kernel.org> # needs a backport
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: http://patchwork.freedesktop.org/patch/msgid/20170622134617.17912-1-chris@chris-wilson.co.uk
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
drivers/gpu/drm/vgem/vgem_drv.c | 81 +++++++++++++++++++++++++++++-----------
drivers/gpu/drm/vgem/vgem_drv.h | 4 +
2 files changed, 64 insertions(+), 21 deletions(-)
--- a/drivers/gpu/drm/vgem/vgem_drv.c
+++ b/drivers/gpu/drm/vgem/vgem_drv.c
@@ -52,6 +52,7 @@ static void vgem_gem_free_object(struct
struct drm_vgem_gem_object *vgem_obj = to_vgem_bo(obj);
kvfree(vgem_obj->pages);
+ mutex_destroy(&vgem_obj->pages_lock);
if (obj->import_attach)
drm_prime_gem_destroy(obj, vgem_obj->table);
@@ -76,11 +77,15 @@ static int vgem_gem_fault(struct vm_faul
if (page_offset > num_pages)
return VM_FAULT_SIGBUS;
+ ret = -ENOENT;
+ mutex_lock(&obj->pages_lock);
if (obj->pages) {
get_page(obj->pages[page_offset]);
vmf->page = obj->pages[page_offset];
ret = 0;
- } else {
+ }
+ mutex_unlock(&obj->pages_lock);
+ if (ret) {
struct page *page;
page = shmem_read_mapping_page(
@@ -161,6 +166,8 @@ static struct drm_vgem_gem_object *__vge
return ERR_PTR(ret);
}
+ mutex_init(&obj->pages_lock);
+
return obj;
}
@@ -274,37 +281,66 @@ static const struct file_operations vgem
.release = drm_release,
};
+static struct page **vgem_pin_pages(struct drm_vgem_gem_object *bo)
+{
+ mutex_lock(&bo->pages_lock);
+ if (bo->pages_pin_count++ == 0) {
+ struct page **pages;
+
+ pages = drm_gem_get_pages(&bo->base);
+ if (IS_ERR(pages)) {
+ bo->pages_pin_count--;
+ mutex_unlock(&bo->pages_lock);
+ return pages;
+ }
+
+ bo->pages = pages;
+ }
+ mutex_unlock(&bo->pages_lock);
+
+ return bo->pages;
+}
+
+static void vgem_unpin_pages(struct drm_vgem_gem_object *bo)
+{
+ mutex_lock(&bo->pages_lock);
+ if (--bo->pages_pin_count == 0) {
+ drm_gem_put_pages(&bo->base, bo->pages, true, true);
+ bo->pages = NULL;
+ }
+ mutex_unlock(&bo->pages_lock);
+}
+
static int vgem_prime_pin(struct drm_gem_object *obj)
{
+ struct drm_vgem_gem_object *bo = to_vgem_bo(obj);
long n_pages = obj->size >> PAGE_SHIFT;
struct page **pages;
- /* Flush the object from the CPU cache so that importers can rely
- * on coherent indirect access via the exported dma-address.
- */
- pages = drm_gem_get_pages(obj);
+ pages = vgem_pin_pages(bo);
if (IS_ERR(pages))
return PTR_ERR(pages);
+ /* Flush the object from the CPU cache so that importers can rely
+ * on coherent indirect access via the exported dma-address.
+ */
drm_clflush_pages(pages, n_pages);
- drm_gem_put_pages(obj, pages, true, false);
return 0;
}
-static struct sg_table *vgem_prime_get_sg_table(struct drm_gem_object *obj)
+static void vgem_prime_unpin(struct drm_gem_object *obj)
{
- struct sg_table *st;
- struct page **pages;
+ struct drm_vgem_gem_object *bo = to_vgem_bo(obj);
- pages = drm_gem_get_pages(obj);
- if (IS_ERR(pages))
- return ERR_CAST(pages);
+ vgem_unpin_pages(bo);
+}
- st = drm_prime_pages_to_sg(pages, obj->size >> PAGE_SHIFT);
- drm_gem_put_pages(obj, pages, false, false);
+static struct sg_table *vgem_prime_get_sg_table(struct drm_gem_object *obj)
+{
+ struct drm_vgem_gem_object *bo = to_vgem_bo(obj);
- return st;
+ return drm_prime_pages_to_sg(bo->pages, bo->base.size >> PAGE_SHIFT);
}
static struct drm_gem_object* vgem_prime_import(struct drm_device *dev,
@@ -333,6 +369,8 @@ static struct drm_gem_object *vgem_prime
__vgem_gem_destroy(obj);
return ERR_PTR(-ENOMEM);
}
+
+ obj->pages_pin_count++; /* perma-pinned */
drm_prime_sg_to_page_addr_arrays(obj->table, obj->pages, NULL,
npages);
return &obj->base;
@@ -340,23 +378,23 @@ static struct drm_gem_object *vgem_prime
static void *vgem_prime_vmap(struct drm_gem_object *obj)
{
+ struct drm_vgem_gem_object *bo = to_vgem_bo(obj);
long n_pages = obj->size >> PAGE_SHIFT;
struct page **pages;
- void *addr;
- pages = drm_gem_get_pages(obj);
+ pages = vgem_pin_pages(bo);
if (IS_ERR(pages))
return NULL;
- addr = vmap(pages, n_pages, 0, pgprot_writecombine(PAGE_KERNEL));
- drm_gem_put_pages(obj, pages, false, false);
-
- return addr;
+ return vmap(pages, n_pages, 0, pgprot_writecombine(PAGE_KERNEL));
}
static void vgem_prime_vunmap(struct drm_gem_object *obj, void *vaddr)
{
+ struct drm_vgem_gem_object *bo = to_vgem_bo(obj);
+
vunmap(vaddr);
+ vgem_unpin_pages(bo);
}
static int vgem_prime_mmap(struct drm_gem_object *obj,
@@ -409,6 +447,7 @@ static struct drm_driver vgem_driver = {
.prime_handle_to_fd = drm_gem_prime_handle_to_fd,
.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
.gem_prime_pin = vgem_prime_pin,
+ .gem_prime_unpin = vgem_prime_unpin,
.gem_prime_import = vgem_prime_import,
.gem_prime_export = drm_gem_prime_export,
.gem_prime_import_sg_table = vgem_prime_import_sg_table,
--- a/drivers/gpu/drm/vgem/vgem_drv.h
+++ b/drivers/gpu/drm/vgem/vgem_drv.h
@@ -43,7 +43,11 @@ struct vgem_file {
#define to_vgem_bo(x) container_of(x, struct drm_vgem_gem_object, base)
struct drm_vgem_gem_object {
struct drm_gem_object base;
+
struct page **pages;
+ unsigned int pages_pin_count;
+ struct mutex pages_lock;
+
struct sg_table *table;
};
next prev parent reply other threads:[~2017-09-08 13:21 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-08 13:18 [PATCH 4.13 00/47] 4.13.1-stable review Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 01/47] usb: quirks: add delay init quirk for Corsair Strafe RGB keyboard Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 02/47] USB: serial: option: add support for D-Link DWM-157 C1 Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 03/47] usb: Add device quirk for Logitech HD Pro Webcam C920-C Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 04/47] usb:xhci:Fix regression when ATI chipsets detected Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 05/47] USB: musb: fix external abort on suspend Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 06/47] ANDROID: binder: add padding to binder_fd_array_object Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 07/47] ANDROID: binder: add hwbinder,vndbinder to BINDER_DEVICES Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 08/47] USB: core: Avoid race of async_completed() w/ usbdev_release() Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 09/47] staging/rts5208: fix incorrect shift to extract upper nybble Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 10/47] staging: ccree: save ciphertext for CTS IV Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 12/47] iio: adc: ti-ads1015: fix incorrect data rate setting update Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 13/47] iio: adc: ti-ads1015: fix scale information for ADS1115 Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 14/47] iio: adc: ti-ads1015: enable conversion when CONFIG_PM is not set Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 15/47] iio: adc: ti-ads1015: avoid getting stale result after runtime resume Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 16/47] iio: adc: ti-ads1015: dont return invalid value from buffer setup callbacks Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 17/47] iio: adc: ti-ads1015: add adequate wait time to get correct conversion Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 18/47] driver core: bus: Fix a potential double free Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 19/47] HID: wacom: Do not completely map WACOM_HID_WD_TOUCHRINGSTATUS usage Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 20/47] binder: free memory on error Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 23/47] thunderbolt: Fix reset response_type Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 24/47] fpga: altera-hps2fpga: fix multiple init of l3_remap_lock Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 25/47] intel_th: pci: Add Cannon Lake PCH-H support Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 26/47] intel_th: pci: Add Cannon Lake PCH-LP support Greg Kroah-Hartman
2017-09-08 13:18 ` [PATCH 4.13 27/47] ath10k: fix memory leak in rx ring buffer allocation Greg Kroah-Hartman
2017-09-08 13:19 ` Greg Kroah-Hartman [this message]
2017-09-08 13:19 ` [PATCH 4.13 31/47] rtlwifi: rtl_pci_probe: Fix fail path of _rtl_pci_find_adapter Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 32/47] Bluetooth: Add support of 13d3:3494 RTL8723BE device Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 33/47] iwlwifi: pci: add new PCI ID for 7265D Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 35/47] mwifiex: correct channel stat buffer overflows Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 36/47] MCB: add support for SC31 to mcb-lpc Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 37/47] s390/mm: avoid empty zero pages for KVM guests to avoid postcopy hangs Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 38/47] drm/nouveau/pci/msi: disable MSI on big-endian platforms by default Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 39/47] drm/nouveau: Fix error handling in nv50_disp_atomic_commit Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 40/47] workqueue: Fix flag collision Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 41/47] ahci: dont use MSI for devices with the silly Intel NVMe remapping scheme Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 42/47] cs5536: add support for IDE controller variant Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 43/47] scsi: sg: protect against races between mmap() and SG_SET_RESERVED_SIZE Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 44/47] scsi: sg: recheck MMAP_IO request length with lock held Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 45/47] of/device: Prevent buffer overflow in of_device_modalias() Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 46/47] rtlwifi: Fix memory leak when firmware request fails Greg Kroah-Hartman
2017-09-08 13:19 ` [PATCH 4.13 47/47] rtlwifi: Fix fallback firmware loading Greg Kroah-Hartman
2017-09-08 16:58 ` [PATCH 4.13 00/47] 4.13.1-stable review Shuah Khan
2017-09-09 4:50 ` Greg Kroah-Hartman
2017-09-09 13:49 ` Guenter Roeck
2017-09-09 14:18 ` Greg Kroah-Hartman
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=20170908131824.820433579@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=chris@chris-wilson.co.uk \
--cc=daniel.vetter@ffwll.ch \
--cc=labbott@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=matthew.auld@intel.com \
--cc=seanpaul@chromium.org \
--cc=stable@vger.kernel.org \
--cc=tomi.p.sarvela@intel.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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).