The patch titled dma-mapping.h: add the dma_unmap state API has been added to the -mm tree. Its filename is dma-mappingh-add-the-dma_unmap-state-api.patch Before you just go and hit "reply", please: a) Consider who else should be cc'ed b) Prefer to cc a suitable mailing list as well c) Ideally: find the original patch on the mailing list and do a reply-to-all to that, adding suitable additional cc's *** Remember to use Documentation/SubmitChecklist when testing your code *** See http://userweb.kernel.org/~akpm/stuff/added-to-mm.txt to find out what to do about this The current -mm tree may be found at http://userweb.kernel.org/~akpm/mmotm/ ------------------------------------------------------ Subject: dma-mapping.h: add the dma_unmap state API From: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx> Adds the following macros: DECLARE_DMA_UNMAP_ADDR(ADDR_NAME) DECLARE_DMA_UNMAP_LEN(LEN_NAME) dma_unmap_addr(PTR, ADDR_NAME) dma_unmap_addr_set(PTR, ADDR_NAME, VAL) dma_unmap_len(PTR, LEN_NAME) dma_unmap_len_set(PTR, LEN_NAME, VAL) The API corresponds to the pci_unmap state API. We'll move to this new generic API from the PCI specific API in the long term. As include/asm-generic/pci-dma-compat.h does, the pci_unmap API simply calls the new generic API for some time. Signed-off-by: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx> Cc: James Bottomley <James.Bottomley@xxxxxxx> Cc: David S. Miller <davem@xxxxxxxxxxxxx> Cc: Jesse Barnes <jbarnes@xxxxxxxxxxxxxxxx> Cc: Arnd Bergmann <arnd@xxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- Documentation/DMA-API.txt | 60 ++++++++++++++++++++++++++++++++++ include/linux/dma-mapping.h | 16 +++++++++ include/linux/pci-dma.h | 21 +++-------- 3 files changed, 82 insertions(+), 15 deletions(-) diff -puN Documentation/DMA-API.txt~dma-mappingh-add-the-dma_unmap-state-api Documentation/DMA-API.txt --- a/Documentation/DMA-API.txt~dma-mappingh-add-the-dma_unmap-state-api +++ a/Documentation/DMA-API.txt @@ -472,6 +472,66 @@ void whizco_dma_map_sg_attrs(struct devi .... +Part Ie - Optimizing Unmap State Space Consumption +-------------------------------- + +On some platforms, dma_unmap_{single,page}() is simply a nop. +Therefore, keeping track of the mapping address and length is a waste +of space. Instead of filling your drivers up with ifdefs and the like +to "work around" this (which would defeat the whole purpose of a +portable API) the following facilities are provided. + +Actually, instead of describing the macros one by one, we'll +transform some example code. + +1) Use DECLARE_DMA_UNMAP_{ADDR,LEN} in state saving structures. + Example, before: + + struct ring_state { + struct sk_buff *skb; + dma_addr_t mapping; + __u32 len; + }; + + after: + + struct ring_state { + struct sk_buff *skb; + DECLARE_DMA_UNMAP_ADDR(mapping) + DECLARE_DMA_UNMAP_LEN(len) + }; + +NOTE: DO NOT put a semicolon at the end of the DECLARE_*() macro. + +2) Use dma_unmap_{addr,len}_set to set these values. + Example, before: + + ringp->mapping = FOO; + ringp->len = BAR; + + after: + + dma_unmap_addr_set(ringp, mapping, FOO); + dma_unmap_len_set(ringp, len, BAR); + +3) Use dma_unmap_{addr,len} to access these values. + Example, before: + + dma_unmap_single(dev, ringp->mapping, ringp->len, + DMA_FROM_DEVICE); + + after: + + dma_unmap_single(dev, + dma_unmap_addr(ringp, mapping), + dma_unmap_len(ringp, len), + DMA_FROM_DEVICE); + +It really should be self-explanatory. We treat the ADDR and LEN +separately, because it is possible for an implementation to only +need the address in order to perform the unmap operation. + + Part II - Advanced dma_ usage ----------------------------- diff -puN include/linux/dma-mapping.h~dma-mappingh-add-the-dma_unmap-state-api include/linux/dma-mapping.h --- a/include/linux/dma-mapping.h~dma-mappingh-add-the-dma_unmap-state-api +++ a/include/linux/dma-mapping.h @@ -232,4 +232,20 @@ struct dma_attrs; #endif /* CONFIG_HAVE_DMA_ATTRS */ +#ifdef CONFIG_NEED_DMA_MAP_STATE +#define DECLARE_DMA_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME; +#define DECLARE_DMA_UNMAP_LEN(LEN_NAME) __u32 LEN_NAME; +#define dma_unmap_addr(PTR, ADDR_NAME) ((PTR)->ADDR_NAME) +#define dma_unmap_addr_set(PTR, ADDR_NAME, VAL) (((PTR)->ADDR_NAME) = (VAL)) +#define dma_unmap_len(PTR, LEN_NAME) ((PTR)->LEN_NAME) +#define dma_unmap_len_set(PTR, LEN_NAME, VAL) (((PTR)->LEN_NAME) = (VAL)) +#else +#define DECLARE_DMA_MAP_ADDR(ADDR_NAME) +#define DECLARE_DMA_UNMAP_LEN(LEN_NAME) +#define dma_unmap_addr(PTR, ADDR_NAME) (0) +#define dma_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) +#define dma_unmap_len(PTR, LEN_NAME) (0) +#define dma_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) +#endif + #endif diff -puN include/linux/pci-dma.h~dma-mappingh-add-the-dma_unmap-state-api include/linux/pci-dma.h --- a/include/linux/pci-dma.h~dma-mappingh-add-the-dma_unmap-state-api +++ a/include/linux/pci-dma.h @@ -1,20 +1,11 @@ #ifndef _LINUX_PCI_DMA_H #define _LINUX_PCI_DMA_H -#ifdef CONFIG_NEED_DMA_MAP_STATE -#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME; -#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) __u32 LEN_NAME; -#define pci_unmap_addr(PTR, ADDR_NAME) ((PTR)->ADDR_NAME) -#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) (((PTR)->ADDR_NAME) = (VAL)) -#define pci_unmap_len(PTR, LEN_NAME) ((PTR)->LEN_NAME) -#define pci_unmap_len_set(PTR, LEN_NAME, VAL) (((PTR)->LEN_NAME) = (VAL)) -#else -#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) -#define DECLARE_PCI_UNMAP_LEN(LEN_NAME) -#define pci_unmap_addr(PTR, ADDR_NAME) (0) -#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) -#define pci_unmap_len(PTR, LEN_NAME) (0) -#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) -#endif +#define DECLARE_PCI_UNMAP_ADDR DECLARE_DMA_UNMAP_ADDR +#define DECLARE_PCI_UNMAP_LEN DECLARE_DMA_UNMAP_LEN +#define pci_unmap_addr dma_unmap_addr +#define pci_unmap_addr_set dma_unmap_addr_set +#define pci_unmap_len dma_unmap_len +#define pci_unmap_len_set dma_unmap_len_set #endif _ Patches currently in -mm which might be from fujita.tomonori@xxxxxxxxxxxxx are origin.patch linux-next.patch scsi-add-__init-__exit-macros-to-ibmvstgtc.patch frv-remove-pci_dma_sync_single-and-pci_dma_sync_sg.patch documentation-dma-apitxt-remove-deprecated-function-descriptions.patch dma-apitxt-add-dma_sync_single-sg-api-description.patch dma-apitxt-remove-dma_sync_single_range-description.patch alpha-remove-dma_sync_single_range.patch um-remove-dma_sync_single_range.patch pci-dma-add-include-linux-pci-dmah.patch pci-dma-x86-use-include-linux-pci-dmah.patch pci-dma-alpha-use-include-linux-pci-dmah.patch pci-dma-arm-use-include-linux-pci-dmah.patch pci-dma-frv-use-include-linux-pci-dmah.patch pci-dma-ia64-use-include-linux-pci-dmah.patch pci-dma-mips-use-include-linux-pci-dmah.patch pci-dma-parisc-use-include-linux-pci-dmah.patch pci-dma-powerpc-use-include-linux-pci-dmah.patch pci-dma-sh-use-include-linux-pci-dmah.patch pci-dma-sparc-use-include-linux-pci-dmah.patch pci-dma-xtensa-use-include-linux-pci-dmah.patch pci-dma-cris-use-include-linux-pci-dmah.patch pci-dma-add-linux-pci-dmah-to-linux-pcih.patch dma-mappingh-add-the-dma_unmap-state-api.patch frv-remove-the-obsolete-and-unnecessary-dma-api-comments.patch blackfin-remove-the-obsolete-and-unnecessary-dma-api-comments.patch mn10300-remove-the-obsolete-and-unnecessary-dma-api-comments.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html