From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S936987AbdAIUsW (ORCPT ); Mon, 9 Jan 2017 15:48:22 -0500 Received: from mail-lf0-f50.google.com ([209.85.215.50]:33438 "EHLO mail-lf0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755354AbdAIUsP (ORCPT ); Mon, 9 Jan 2017 15:48:15 -0500 To: Jens Axboe , linux-block@vger.kernel.org Cc: "linux-kernel@vger.kernel.org" , Artemi Ivanov From: Nikita Yushchenko Subject: blk_queue_bounce_limit() broken for mask=0xffffffff on 64bit archs X-Enigmail-Draft-Status: N1110 Message-ID: <632ad7f3-e837-a17c-5ba7-ed9800ba3ec0@cogentembedded.com> Date: Mon, 9 Jan 2017 23:48:11 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Icedove/45.5.1 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi There is a use cases when architecture is 64-bit but hardware supports only DMA to lower 4G of address space. E.g. NVMe device on RCar PCIe host. For such cases, it looks proper to call blk_queue_bounce_limit() with mask set to 0xffffffff - thus making block layer to use bounce buffers for any addresses beyond 4G. To support that, architecture provides GFP_DMA zone that covers exactly low 4G on arm64. However setting this limit does not work: if (b_pfn < (min_t(u64, 0xffffffffUL, BLK_BOUNCE_HIGH) >> PAGE_SHIFT)) dma = 1; When mask is 0xffffffff that condition is false q->limits.bounce_pfn = max(max_low_pfn, b_pfn); this line is executed and replaces any limit with end of memory (on 64bit arch all memory is low). Not sure how to fix this properly. Any hints?