From patchwork Thu Dec 7 23:42:49 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Stultz X-Patchwork-Id: 121108 Delivered-To: patches@linaro.org Received: by 10.140.22.227 with SMTP id 90csp9003771qgn; Thu, 7 Dec 2017 15:42:59 -0800 (PST) X-Received: by 10.84.244.136 with SMTP id h8mr4478611pll.222.1512690179215; Thu, 07 Dec 2017 15:42:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1512690179; cv=none; d=google.com; s=arc-20160816; b=qaBQ63hjPbICUVqv/WiNn7hJsEN7Rg404sBD1MTLtvv4uQkhJV9L7xH6H08oimpyGF nGVFv4FZs08LNEkFFfA17NY7Z40+Vxb/VFLyvuTlHyKNgdo/dF1AHPI+Oih28t8iM189 p/3xWOdg2RisIhYCom837Ft9Y9pQ7IVdlcTOFz4RbyzJFvRFTgSHDMWRSg7HYun3RbZ/ lefTK1JbTxIzZJpIGemvS6t3WSVrvgob2ivI1f4NCdkN+AINYtvdBJkpPFeR8VKmSsbg zQjSKXc8dLTbfr5exTBElHG47TsCsisbX3ix8nwPm4oHfh5QsAw7vxQi4a0SltGcLr7p FjNw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=GZIqIPqvYn7b1Vsc88cO9tU+3HoUnGu7amHgdipmrQU=; b=dSq00CjxU19gCpgStBvbPL+dOtJHnv9pHMZ5BaAs8+XmVfevxJBbqFiktHgMMtI9mJ kF8zFXFk4PDxBJYGEQQsVt0fqkWTQOO8Pe7C6FukVi83DBzA/sBhtA7UObJremUtTNHk d+QXH/1f/AtfQT4KWghc059mCAzAqF82m8JOwj38SFXXIk5Sp50Nc9LJrrrmW1SPEEb6 +l6zGfY2mowtaS+pImvL0yozbknOsm5292gb+VP2o5hLpQG/SAT5KDMcnvmkjuaNugly MniGAhs27x/9gUZN7bPUG/flbkQtHwdtusun+fYGedNTy7R6EZcCd9DzePjX0bIXsWzT JHkg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=FHJrGTuy; spf=pass (google.com: domain of john.stultz@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=john.stultz@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id x6sor2637375plr.3.2017.12.07.15.42.59 for (Google Transport Security); Thu, 07 Dec 2017 15:42:59 -0800 (PST) Received-SPF: pass (google.com: domain of john.stultz@linaro.org designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=FHJrGTuy; spf=pass (google.com: domain of john.stultz@linaro.org designates 209.85.220.65 as permitted sender) smtp.mailfrom=john.stultz@linaro.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id; bh=GZIqIPqvYn7b1Vsc88cO9tU+3HoUnGu7amHgdipmrQU=; b=FHJrGTuyzIkQsehkWMi1AdbcgZz+LxvR0kUdvPDtMh41BsEWkiJqe0PLv21P+e/w7D 6twJM+iTvKApOGysnVhVZ1dgpwBItVUmK3qYCI1aSXnhIunL3Nx3BznJ5OLtQgATYjOk HeJl3N8RIqP7EcJIfZtq1YOmlT7ksUXOEjckk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=GZIqIPqvYn7b1Vsc88cO9tU+3HoUnGu7amHgdipmrQU=; b=Nw58M7SQmBCk4DrjgArjXNwCUoki/gDrJZhfJd0bHPcwRLvknD26Afp6XItH6exfAV iuOzKYQ6GZYyfwKgcfHfW86jSmhGKvNwRc6/oQQoG9BvkffL8c/HkVRLOr46K7PxLQIC IVaKew39yxrpqEwdWEJXugAo2dKiVgeUCVBDliUIuyXWy0UwQmIwA5fgjlil0Mr44fbI ZnPNP/AcovCr6CCAGBlAwqpLlW+oqdPqvxoi8ghEVfuslstezBXrxrxSsmF3JI/J8ge+ 03D6JPomlgsCC49ZJiePortQ1XfhKvB0/0ItFhiQUnR27vlhQqfJ6FxeLMaenkRDWrF/ DhrQ== X-Gm-Message-State: AJaThX7l5SsWgrGHIlw9RVHfr2DzoXY5QxTDUlG5IYyAyiUh6ZvqTvCk rmJqq/DI7D+EHszhXdts8ZH2UDHOVDtM7w== X-Google-Smtp-Source: AGs4zMbZwHP4on4h1kZfZ73UddZVsy9c8h2x1mTnFX+k5p1pAOQWM3BdVbDDH9kRxZg3RzjQCbpMRw== X-Received: by 10.159.254.6 with SMTP id r6mr28282134pls.144.1512690178563; Thu, 07 Dec 2017 15:42:58 -0800 (PST) Return-Path: Received: from localhost.localdomain ([2601:1c2:600:5100:4e72:b9ff:fe99:466a]) by smtp.gmail.com with ESMTPSA id j17sm8708364pgv.40.2017.12.07.15.42.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 07 Dec 2017 15:42:57 -0800 (PST) From: John Stultz To: linux-kernel@vger.kernel.org Cc: John Stultz , Laura Abbott , Sumit Semwal , Benjamin Gaignard , Archit Taneja , Greg KH , Daniel Vetter , Dmitry Shmidt , Todd Kjos , Amit Pundir Subject: [RFC][PATCH] staging: ion: Fix ion_cma_heap allocations Date: Thu, 7 Dec 2017 15:42:49 -0800 Message-Id: <1512690169-27217-1-git-send-email-john.stultz@linaro.org> X-Mailer: git-send-email 2.7.4 In trying to add support for drm_hwcomposer to HiKey, I've needed to utilize the ION CMA heap, and I've noticed problems with allocations on newer kernels failing. It seems back with 204f672255c22 ("ion: Use CMA APIs directly"), the ion_cma_heap code was modified to use the CMA API, but kept the arguments as buffer lengths rather then number of pages. This results in errors as we don't have enough pages in CMA to satisfy the exaggerated requests. This patch converts the ion_cma_heap CMA API usage to properly request pages. It also fixes a minor issue in the allocation where in the error path, the cma_release is called with the buffer->size value which hasn't yet been set. I'm no memory expert so close review would be appreciated! Cc: Laura Abbott Cc: Sumit Semwal Cc: Benjamin Gaignard Cc: Archit Taneja Cc: Greg KH Cc: Daniel Vetter Cc: Dmitry Shmidt Cc: Todd Kjos Cc: Amit Pundir Signed-off-by: John Stultz --- drivers/staging/android/ion/ion_cma_heap.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) -- 2.7.4 Acked-by: Laura Abbott diff --git a/drivers/staging/android/ion/ion_cma_heap.c b/drivers/staging/android/ion/ion_cma_heap.c index dd5545d..b0fb895 100644 --- a/drivers/staging/android/ion/ion_cma_heap.c +++ b/drivers/staging/android/ion/ion_cma_heap.c @@ -39,9 +39,15 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer, struct ion_cma_heap *cma_heap = to_cma_heap(heap); struct sg_table *table; struct page *pages; + unsigned long size = PAGE_ALIGN(len); + unsigned long nr_pages = size >> PAGE_SHIFT; + unsigned long align = get_order(size); int ret; - pages = cma_alloc(cma_heap->cma, len, 0, GFP_KERNEL); + if (align > CONFIG_CMA_ALIGNMENT) + align = CONFIG_CMA_ALIGNMENT; + + pages = cma_alloc(cma_heap->cma, nr_pages, align, GFP_KERNEL); if (!pages) return -ENOMEM; @@ -53,7 +59,7 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer, if (ret) goto free_mem; - sg_set_page(table->sgl, pages, len, 0); + sg_set_page(table->sgl, pages, size, 0); buffer->priv_virt = pages; buffer->sg_table = table; @@ -62,7 +68,7 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer, free_mem: kfree(table); err: - cma_release(cma_heap->cma, pages, buffer->size); + cma_release(cma_heap->cma, pages, nr_pages); return -ENOMEM; } @@ -70,9 +76,10 @@ static void ion_cma_free(struct ion_buffer *buffer) { struct ion_cma_heap *cma_heap = to_cma_heap(buffer->heap); struct page *pages = buffer->priv_virt; + unsigned long nr_pages = PAGE_ALIGN(buffer->size) >> PAGE_SHIFT; /* release memory */ - cma_release(cma_heap->cma, pages, buffer->size); + cma_release(cma_heap->cma, pages, nr_pages); /* release sg table */ sg_free_table(buffer->sg_table); kfree(buffer->sg_table);