From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jens Axboe Subject: Re: PROBLEM: compilation issue, Incorrect C usage in drivers/block/null_blk.c causes kernel compilation failure with Intel c++ compiler Date: Wed, 13 Jan 2016 13:01:02 -0700 Message-ID: <5696ACFE.5080403@kernel.dk> References: <5696A70C.6080700@infradead.org> <5696A777.7070004@infradead.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------050606070209070907060505" Cc: "'x86@kernel.org'" , "'kvm@vger.kernel.org'" , "'linux-kernel@vger.kernel.org'" To: Randy Dunlap , "Blower, Melanie" , "'tglx@linutronix.de'" , "'mingo@redhat.com'" , "'hpa@zytor.com'" , "'avi@redhat.com'" Return-path: In-Reply-To: <5696A777.7070004@infradead.org> Sender: linux-kernel-owner@vger.kernel.org List-Id: kvm.vger.kernel.org This is a multi-part message in MIME format. --------------050606070209070907060505 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 01/13/2016 12:37 PM, Randy Dunlap wrote: > [add Jens Axboe] > > > On 01/13/16 11:35, Randy Dunlap wrote: >> On 01/13/16 11:22, Blower, Melanie wrote: >>> [1.] Incorrect C usage in drivers/block/null_blk.c causes kernel compilation failure with Intel c++ compiler >>> [2.] Full description of the problem/report: >>> Using icc, >>> drivers/block/null_blk.c(569): error: variable "null_lnvm_dev_ops" was declared with a never-completed type >>> static struct nvm_dev_ops null_lnvm_dev_ops; >>> >>> Clark Nelson, one of Intel's C++ language lawyers, explains why this declaration is illegal: >>> >>> Discussion: >>> Here is the problematic declaration, which appears near line 585 of file drivers/block/null_blk.c: >>> >>> static struct nvm_dev_ops null_lnvm_dev_ops; So that's a very verbose way of saying that the structure is undefined if CONFIG_NVM isn't set. I agree, that's crap code, doesn't make any sense. Surprised gcc doesn't complain about it. Something like the attached should fix it, making enough visible with CONFIG_NVM that we can declare an empty ops type. -- Jens Axboe --------------050606070209070907060505 Content-Type: text/x-patch; name="nvm-ops.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="nvm-ops.patch" diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h index 3db5552b17d5..b0965c110b62 100644 --- a/include/linux/lightnvm.h +++ b/include/linux/lightnvm.h @@ -11,6 +11,65 @@ enum { NVM_IOTYPE_GC = 1, }; +struct nvm_id; +struct nvm_rq; + +#define NVM_BLK_BITS (16) +#define NVM_PG_BITS (16) +#define NVM_SEC_BITS (8) +#define NVM_PL_BITS (8) +#define NVM_LUN_BITS (8) +#define NVM_CH_BITS (8) + +struct ppa_addr { + /* Generic structure for all addresses */ + union { + struct { + u64 blk : NVM_BLK_BITS; + u64 pg : NVM_PG_BITS; + u64 sec : NVM_SEC_BITS; + u64 pl : NVM_PL_BITS; + u64 lun : NVM_LUN_BITS; + u64 ch : NVM_CH_BITS; + } g; + + u64 ppa; + }; +}; + +typedef int (nvm_l2p_update_fn)(u64, u32, __le64 *, void *); +typedef int (nvm_bb_update_fn)(struct ppa_addr, int, u8 *, void *); +typedef int (nvm_id_fn)(struct request_queue *, struct nvm_id *); +typedef int (nvm_get_l2p_tbl_fn)(struct request_queue *, u64, u32, + nvm_l2p_update_fn *, void *); +typedef int (nvm_op_bb_tbl_fn)(struct request_queue *, struct ppa_addr, int, + nvm_bb_update_fn *, void *); +typedef int (nvm_op_set_bb_fn)(struct request_queue *, struct nvm_rq *, int); +typedef int (nvm_submit_io_fn)(struct request_queue *, struct nvm_rq *); +typedef int (nvm_erase_blk_fn)(struct request_queue *, struct nvm_rq *); +typedef void *(nvm_create_dma_pool_fn)(struct request_queue *, char *); +typedef void (nvm_destroy_dma_pool_fn)(void *); +typedef void *(nvm_dev_dma_alloc_fn)(struct request_queue *, void *, gfp_t, + dma_addr_t *); +typedef void (nvm_dev_dma_free_fn)(void *, void*, dma_addr_t); + +struct nvm_dev_ops { + nvm_id_fn *identity; + nvm_get_l2p_tbl_fn *get_l2p_tbl; + nvm_op_bb_tbl_fn *get_bb_tbl; + nvm_op_set_bb_fn *set_bb_tbl; + + nvm_submit_io_fn *submit_io; + nvm_erase_blk_fn *erase_block; + + nvm_create_dma_pool_fn *create_dma_pool; + nvm_destroy_dma_pool_fn *destroy_dma_pool; + nvm_dev_dma_alloc_fn *dev_dma_alloc; + nvm_dev_dma_free_fn *dev_dma_free; + + unsigned int max_phys_sect; +}; + #ifdef CONFIG_NVM #include @@ -118,29 +177,6 @@ struct nvm_tgt_instance { #define NVM_VERSION_MINOR 0 #define NVM_VERSION_PATCH 0 -#define NVM_BLK_BITS (16) -#define NVM_PG_BITS (16) -#define NVM_SEC_BITS (8) -#define NVM_PL_BITS (8) -#define NVM_LUN_BITS (8) -#define NVM_CH_BITS (8) - -struct ppa_addr { - /* Generic structure for all addresses */ - union { - struct { - u64 blk : NVM_BLK_BITS; - u64 pg : NVM_PG_BITS; - u64 sec : NVM_SEC_BITS; - u64 pl : NVM_PL_BITS; - u64 lun : NVM_LUN_BITS; - u64 ch : NVM_CH_BITS; - } g; - - u64 ppa; - }; -}; - struct nvm_rq { struct nvm_tgt_instance *ins; struct nvm_dev *dev; @@ -174,39 +210,6 @@ static inline void *nvm_rq_to_pdu(struct nvm_rq *rqdata) struct nvm_block; -typedef int (nvm_l2p_update_fn)(u64, u32, __le64 *, void *); -typedef int (nvm_bb_update_fn)(struct ppa_addr, int, u8 *, void *); -typedef int (nvm_id_fn)(struct request_queue *, struct nvm_id *); -typedef int (nvm_get_l2p_tbl_fn)(struct request_queue *, u64, u32, - nvm_l2p_update_fn *, void *); -typedef int (nvm_op_bb_tbl_fn)(struct request_queue *, struct ppa_addr, int, - nvm_bb_update_fn *, void *); -typedef int (nvm_op_set_bb_fn)(struct request_queue *, struct nvm_rq *, int); -typedef int (nvm_submit_io_fn)(struct request_queue *, struct nvm_rq *); -typedef int (nvm_erase_blk_fn)(struct request_queue *, struct nvm_rq *); -typedef void *(nvm_create_dma_pool_fn)(struct request_queue *, char *); -typedef void (nvm_destroy_dma_pool_fn)(void *); -typedef void *(nvm_dev_dma_alloc_fn)(struct request_queue *, void *, gfp_t, - dma_addr_t *); -typedef void (nvm_dev_dma_free_fn)(void *, void*, dma_addr_t); - -struct nvm_dev_ops { - nvm_id_fn *identity; - nvm_get_l2p_tbl_fn *get_l2p_tbl; - nvm_op_bb_tbl_fn *get_bb_tbl; - nvm_op_set_bb_fn *set_bb_tbl; - - nvm_submit_io_fn *submit_io; - nvm_erase_blk_fn *erase_block; - - nvm_create_dma_pool_fn *create_dma_pool; - nvm_destroy_dma_pool_fn *destroy_dma_pool; - nvm_dev_dma_alloc_fn *dev_dma_alloc; - nvm_dev_dma_free_fn *dev_dma_free; - - unsigned int max_phys_sect; -}; - struct nvm_lun { int id; --------------050606070209070907060505--