Received: by 10.223.185.116 with SMTP id b49csp2540548wrg; Mon, 12 Feb 2018 11:13:23 -0800 (PST) X-Google-Smtp-Source: AH8x227w2kpk9r2/Kx5o9yHQCB9HG2Q8qvVpSFMYT3nhhqUuwReYE16iC2eyACkjxIaGpEn5n6Fb X-Received: by 10.101.64.67 with SMTP id h3mr10065572pgp.168.1518462803571; Mon, 12 Feb 2018 11:13:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518462803; cv=none; d=google.com; s=arc-20160816; b=kR9+StubmXFqD5Dc/rugpl/E6/Zz21pwqzdDo7XBkk1yTX9rgmf2cfqKpcVH5aoxrP EIHt19jWEgXtZzaXCAlRm1mGZC5FXhjnuo2M08jtEjXU0LvcEu1MDZed67jU5nraEbJP rvtT6hpD2DzV6BSQZHvJU6nSUHhqWWNkNQvSxvPEdpRdqr4av7hgUeYuMilvdqifJeMh 1tkL6oOstymyW9px99b//xY9pRMtWmOKKkuofjSYric8TP216DZJ0O45W0QAMxmpxeSt TJqF9flIxLVHy1o34epNOrZotgOphj4qkDI3YcxY0KPw5Y6RnXgQ7d86klG9p0LicK6v rQBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=zibx7Uf2I5Lt+jEMXbaTC084DVPRuQD+ho+TEqUTKKg=; b=P2TU5QYaifFW1gEMjagzcJ4VKakFBUMu0LVqZlfWHzJWtR3eKvD8KE64LY66YReAWe H97kyBWnEI6eRoTsHUmhxnySDtRaJ17qng30InIoMH/l4mEhtxbhJVxwNx6WniUiNWeR rRB/I972BgkuUWr42fohXtTxM4dV8UgWv4Fa3EtlF9SqD2Xwf5nnDS0R3eRGcJAmSwRy DltyDw+wQDkzlBlmZhOknMlHGznOLtzHY5EuFB3vdKuLVeKQeWlt0fWHKq1v5mUwmL4/ taXwGgqIz8hlDcvla8c1RWrMFxsHIF9XtFzZJj3luj0zKj41G5jIHdzkomP3t7NJYIu+ DchA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id n1-v6si6083162pld.589.2018.02.12.11.13.08; Mon, 12 Feb 2018 11:13:23 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751196AbeBLTLh (ORCPT + 99 others); Mon, 12 Feb 2018 14:11:37 -0500 Received: from mga06.intel.com ([134.134.136.31]:34150 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753637AbeBLTLg (ORCPT ); Mon, 12 Feb 2018 14:11:36 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Feb 2018 11:11:35 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,503,1511856000"; d="scan'208";a="17365535" Received: from alexey-system-product-name.iil.intel.com (HELO [10.236.193.131]) ([10.236.193.131]) by fmsmga008.fm.intel.com with ESMTP; 12 Feb 2018 11:11:11 -0800 Subject: Re: [PATCH] staging: android: ion: Add requested allocation alignment To: Laura Abbott , sumit.semwal@linaro.org, gregkh@linuxfoundation.org, arve@android.com, tkjos@android.com, maco@android.com, devel@driverdev.osuosl.org Cc: linux-kernel@vger.kernel.org, Liam Mark References: <1518257863-6903-1-git-send-email-alexey.skidanov@intel.com> From: Alexey Skidanov Message-ID: <8284b2ba-a532-23fd-4c52-7ac556d63918@intel.com> Date: Mon, 12 Feb 2018 21:11:40 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 02/12/2018 08:42 PM, Laura Abbott wrote: > On 02/10/2018 02:17 AM, Alexey Skidanov wrote: >> Current ion defined allocation ioctl doesn't allow to specify the >> requested >> allocation alignment. CMA heap allocates buffers aligned on buffer size >> page order. >> >> Sometimes, the alignment requirement is less restrictive. In such cases, >> providing specific alignment may reduce the external memory fragmentation >> and in some cases it may avoid the allocation request failure. >> > > I really do not want to bring this back as part of the regular > ABI. Yes, I know it was removed in 4.12. Having an alignment parameter that gets used for exactly > one heap only leads to confusion (which is why it was removed > from the ABI in the first place). You are correct regarding the CMA heap. But, probably it may be used by custom heap as well. > > The alignment came from the behavior of the DMA APIs. Do you > actually need to specify any alignment from userspace or do > you only need page size? Yes. If CMA gives it for free, I would suggest to let the ion user to decide > > Thanks, > Laura > Thanks, Alexey >> To fix this, we add an alignment parameter to the allocation ioctl. >> >> Signed-off-by: Alexey Skidanov >> --- >>   drivers/staging/android/ion/ion-ioctl.c         |  3 ++- >>   drivers/staging/android/ion/ion.c               | 14 +++++++++----- >>   drivers/staging/android/ion/ion.h               |  9 ++++++--- >>   drivers/staging/android/ion/ion_carveout_heap.c |  3 ++- >>   drivers/staging/android/ion/ion_chunk_heap.c    |  3 ++- >>   drivers/staging/android/ion/ion_cma_heap.c      | 18 ++++++++++++------ >>   drivers/staging/android/ion/ion_system_heap.c   |  6 ++++-- >>   drivers/staging/android/uapi/ion.h              |  7 +++---- >>   8 files changed, 40 insertions(+), 23 deletions(-) >> >> diff --git a/drivers/staging/android/ion/ion-ioctl.c >> b/drivers/staging/android/ion/ion-ioctl.c >> index c789893..9fe022b 100644 >> --- a/drivers/staging/android/ion/ion-ioctl.c >> +++ b/drivers/staging/android/ion/ion-ioctl.c >> @@ -83,7 +83,8 @@ long ion_ioctl(struct file *filp, unsigned int cmd, >> unsigned long arg) >>             fd = ion_alloc(data.allocation.len, >>                      data.allocation.heap_id_mask, >> -                   data.allocation.flags); >> +                   data.allocation.flags, >> +                   data.allocation.align); >>           if (fd < 0) >>               return fd; >>   diff --git a/drivers/staging/android/ion/ion.c >> b/drivers/staging/android/ion/ion.c >> index f480885..35ddc7a 100644 >> --- a/drivers/staging/android/ion/ion.c >> +++ b/drivers/staging/android/ion/ion.c >> @@ -78,7 +78,8 @@ static void ion_buffer_add(struct ion_device *dev, >>   static struct ion_buffer *ion_buffer_create(struct ion_heap *heap, >>                           struct ion_device *dev, >>                           unsigned long len, >> -                        unsigned long flags) >> +                        unsigned long flags, >> +                        unsigned int align) >>   { >>       struct ion_buffer *buffer; >>       int ret; >> @@ -90,14 +91,14 @@ static struct ion_buffer *ion_buffer_create(struct >> ion_heap *heap, >>       buffer->heap = heap; >>       buffer->flags = flags; >>   -    ret = heap->ops->allocate(heap, buffer, len, flags); >> +    ret = heap->ops->allocate(heap, buffer, len, flags, align); >>         if (ret) { >>           if (!(heap->flags & ION_HEAP_FLAG_DEFER_FREE)) >>               goto err2; >>             ion_heap_freelist_drain(heap, 0); >> -        ret = heap->ops->allocate(heap, buffer, len, flags); >> +        ret = heap->ops->allocate(heap, buffer, len, flags, align); >>           if (ret) >>               goto err2; >>       } >> @@ -390,7 +391,10 @@ static const struct dma_buf_ops dma_buf_ops = { >>       .unmap = ion_dma_buf_kunmap, >>   }; >>   -int ion_alloc(size_t len, unsigned int heap_id_mask, unsigned int >> flags) >> +int ion_alloc(size_t len, >> +          unsigned int heap_id_mask, >> +          unsigned int flags, >> +          unsigned int align) >>   { >>       struct ion_device *dev = internal_dev; >>       struct ion_buffer *buffer = NULL; >> @@ -417,7 +421,7 @@ int ion_alloc(size_t len, unsigned int >> heap_id_mask, unsigned int flags) >>           /* if the caller didn't specify this heap id */ >>           if (!((1 << heap->id) & heap_id_mask)) >>               continue; >> -        buffer = ion_buffer_create(heap, dev, len, flags); >> +        buffer = ion_buffer_create(heap, dev, len, flags, align); >>           if (!IS_ERR(buffer)) >>               break; >>       } >> diff --git a/drivers/staging/android/ion/ion.h >> b/drivers/staging/android/ion/ion.h >> index f5f9cd6..0c161d2 100644 >> --- a/drivers/staging/android/ion/ion.h >> +++ b/drivers/staging/android/ion/ion.h >> @@ -123,8 +123,10 @@ struct ion_device { >>    */ >>   struct ion_heap_ops { >>       int (*allocate)(struct ion_heap *heap, >> -            struct ion_buffer *buffer, unsigned long len, >> -            unsigned long flags); >> +            struct ion_buffer *buffer, >> +            unsigned long len, >> +            unsigned long flags, >> +            unsigned int align); >>       void (*free)(struct ion_buffer *buffer); >>       void * (*map_kernel)(struct ion_heap *heap, struct ion_buffer >> *buffer); >>       void (*unmap_kernel)(struct ion_heap *heap, struct ion_buffer >> *buffer); >> @@ -228,7 +230,8 @@ int ion_heap_pages_zero(struct page *page, size_t >> size, pgprot_t pgprot); >>     int ion_alloc(size_t len, >>             unsigned int heap_id_mask, >> -          unsigned int flags); >> +          unsigned int flags, >> +          unsigned int align); >>     /** >>    * ion_heap_init_shrinker >> diff --git a/drivers/staging/android/ion/ion_carveout_heap.c >> b/drivers/staging/android/ion/ion_carveout_heap.c >> index fee7650..deae9dd 100644 >> --- a/drivers/staging/android/ion/ion_carveout_heap.c >> +++ b/drivers/staging/android/ion/ion_carveout_heap.c >> @@ -59,7 +59,8 @@ static void ion_carveout_free(struct ion_heap *heap, >> phys_addr_t addr, >>   static int ion_carveout_heap_allocate(struct ion_heap *heap, >>                         struct ion_buffer *buffer, >>                         unsigned long size, >> -                      unsigned long flags) >> +                      unsigned long flags, >> +                      unsigned int align) >>   { >>       struct sg_table *table; >>       phys_addr_t paddr; >> diff --git a/drivers/staging/android/ion/ion_chunk_heap.c >> b/drivers/staging/android/ion/ion_chunk_heap.c >> index 102c093..15f9518 100644 >> --- a/drivers/staging/android/ion/ion_chunk_heap.c >> +++ b/drivers/staging/android/ion/ion_chunk_heap.c >> @@ -35,7 +35,8 @@ struct ion_chunk_heap { >>   static int ion_chunk_heap_allocate(struct ion_heap *heap, >>                      struct ion_buffer *buffer, >>                      unsigned long size, >> -                   unsigned long flags) >> +                   unsigned long flags, >> +                   unsigned int align) >>   { >>       struct ion_chunk_heap *chunk_heap = >>           container_of(heap, struct ion_chunk_heap, heap); >> diff --git a/drivers/staging/android/ion/ion_cma_heap.c >> b/drivers/staging/android/ion/ion_cma_heap.c >> index 86196ff..f3f8deb 100644 >> --- a/drivers/staging/android/ion/ion_cma_heap.c >> +++ b/drivers/staging/android/ion/ion_cma_heap.c >> @@ -32,25 +32,31 @@ struct ion_cma_heap { >>   #define to_cma_heap(x) container_of(x, struct ion_cma_heap, heap) >>     /* ION CMA heap operations functions */ >> -static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer >> *buffer, >> +static int ion_cma_allocate(struct ion_heap *heap, >> +                struct ion_buffer *buffer, >>                   unsigned long len, >> -                unsigned long flags) >> +                unsigned long flags, >> +                unsigned int align) >>   { >>       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 order = get_order(align); >>       int ret; >>   -    if (align > CONFIG_CMA_ALIGNMENT) >> -        align = CONFIG_CMA_ALIGNMENT; >> +    /* CMA allocation alignment is in PAGE_SIZE order */ >> +    if (order > CONFIG_CMA_ALIGNMENT) >> +        order = CONFIG_CMA_ALIGNMENT; >>   -    pages = cma_alloc(cma_heap->cma, nr_pages, align, GFP_KERNEL); >> +    pages = cma_alloc(cma_heap->cma, nr_pages, order, GFP_KERNEL); >>       if (!pages) >>           return -ENOMEM; >>   +    pr_debug("Allocated block of %lu pages starting at 0x%lX", >> +         nr_pages, page_to_pfn(pages)); >> + >>       table = kmalloc(sizeof(*table), GFP_KERNEL); >>       if (!table) >>           goto err; >> diff --git a/drivers/staging/android/ion/ion_system_heap.c >> b/drivers/staging/android/ion/ion_system_heap.c >> index 4dc5d7a..b5a1720 100644 >> --- a/drivers/staging/android/ion/ion_system_heap.c >> +++ b/drivers/staging/android/ion/ion_system_heap.c >> @@ -125,7 +125,8 @@ static struct page *alloc_largest_available(struct >> ion_system_heap *heap, >>   static int ion_system_heap_allocate(struct ion_heap *heap, >>                       struct ion_buffer *buffer, >>                       unsigned long size, >> -                    unsigned long flags) >> +                    unsigned long flags, >> +                    unsigned int align) >>   { >>       struct ion_system_heap *sys_heap = container_of(heap, >>                               struct ion_system_heap, >> @@ -363,7 +364,8 @@ device_initcall(ion_system_heap_create); >>   static int ion_system_contig_heap_allocate(struct ion_heap *heap, >>                          struct ion_buffer *buffer, >>                          unsigned long len, >> -                       unsigned long flags) >> +                       unsigned long flags, >> +                       unsigned int align) >>   { >>       int order = get_order(len); >>       struct page *page; >> diff --git a/drivers/staging/android/uapi/ion.h >> b/drivers/staging/android/uapi/ion.h >> index 9e21451..b093edd 100644 >> --- a/drivers/staging/android/uapi/ion.h >> +++ b/drivers/staging/android/uapi/ion.h >> @@ -70,9 +70,8 @@ enum ion_heap_type { >>    * @len:        size of the allocation >>    * @heap_id_mask:    mask of heap ids to allocate from >>    * @flags:        flags passed to heap >> - * @handle:        pointer that will be populated with a cookie to >> use to >> - *            refer to this allocation >> - * >> + * @fd:        file descriptor associated with newly allocated buffer >> + * @align:    allocation alignment >>    * Provided by userspace as an argument to the ioctl >>    */ >>   struct ion_allocation_data { >> @@ -80,7 +79,7 @@ struct ion_allocation_data { >>       __u32 heap_id_mask; >>       __u32 flags; >>       __u32 fd; >> -    __u32 unused; >> +    __u32 align; >>   }; >>     #define MAX_HEAP_NAME            32 >> >