Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S966397AbcCPIXt (ORCPT ); Wed, 16 Mar 2016 04:23:49 -0400 Received: from verein.lst.de ([213.95.11.211]:49860 "EHLO newverein.lst.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S966375AbcCPIXl (ORCPT ); Wed, 16 Mar 2016 04:23:41 -0400 Date: Wed, 16 Mar 2016 09:23:39 +0100 From: Christoph Hellwig To: Ming Lin Cc: linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org, Christoph Hellwig Subject: Re: [PATCH RFC 1/2] scatterlist: add mempool based chained SG alloc/free api Message-ID: <20160316082339.GA6203@lst.de> References: <1458081569-30953-1-git-send-email-mlin@kernel.org> <1458081569-30953-2-git-send-email-mlin@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1458081569-30953-2-git-send-email-mlin@kernel.org> User-Agent: Mutt/1.5.17 (2007-11-01) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2238 Lines: 66 > /* > + * The maximum number of SG segments that we will put inside a > + * scatterlist. > + * > + * XXX: what's the best number? > + */ > +#define SG_MAX_SEGMENTS 128 The important part here is that it's the amount we fit into a single scatterlist chunk. So I think naming it SG_CHUNK_SIZE or similar would be a better idea (the name in SCSI is from the days before we supported chained S/G lists). It would also be good to â…ºring over the comments from SCSI_MAX_SG_SEGMENTS. We'll also need a symbol like SCSI_MAX_SG_CHAIN_SEGMENTS that contains the absolute limit, and we need the CONFIG_ARCH_HAS_SG_CHAIN magic around it for now as we still have architetures that do not support S/G chanining in their dma_map_sg implementation. I plan to fix that up in a merge window or two, though. My name suggestion for that would be SG_MAX_SEGMENTS. > +#define SG_MEMPOOL_NR ARRAY_SIZE(sg_pools) We can defintively kill this one. > +#define SG_MEMPOOL_SIZE 2 > + > +struct sg_mempool { I'd keep this as struct sg_pool, similar to SCSI. > +/** > + * sg_free_chained - Free a previously mapped sg table > + * @table: The sg table header to use > + * @first_chunk: was first_chunk not NULL in sg_alloc_chained? > + * > + * Description: > + * Free an sg table previously allocated and setup with > + * sg_alloc_chained(). > + * > + **/ > +void sg_free_chained(struct sg_table *table, bool first_chunk) Can we call this sg_free_table_chained to be similar to sg_table_free? Same for the alloc side. > +static __init int sg_mempool_init(void) > +{ > + int i; > + > + for (i = 0; i < SG_MEMPOOL_NR; i++) { > + struct sg_mempool *sgp = sg_pools + i; > + int size = sgp->size * sizeof(struct scatterlist); > + > + sgp->slab = kmem_cache_create(sgp->name, size, 0, > + SLAB_HWCACHE_ALIGN, NULL); Having these mempoools around in every kernel will make some embedded developers rather unhappy. We could either not create them at runtime, which would require either a check in the fast path, or an init call in every driver, or just move the functions you added into a separe file, which will be compiled only based on a Kconfig symbol, and could even be potentially modular. I think that second option might be easier.