On Tue, 2019-03-12 at 16:30 -0700, James Smart wrote: > Currently the driver maintains a sideband structure which has a > pointer for each queue element. However, at 8bytes a pointer, and up > to 4k elements per queue, and 100's of queues, this can take up a lot > of memory. > > Convert the driver to using an access routine that calculates the > element address based on it's index rather than using the pointer > table. We're getting a failure from the ppc builds according to linux-next: n file included from drivers/scsi/lpfc/lpfc_debugfs.c:46: drivers/scsi/lpfc/lpfc_debugfs.c: In function 'lpfc_idiag_queacc_write': drivers/scsi/lpfc/lpfc_sli4.h:1083:14: error: inlining failed in call to always_inline 'lpfc_sli4_qe': function body not available inline void *lpfc_sli4_qe(struct lpfc_queue *, uint16_t); ^~~~~~~~~~~~ drivers/scsi/lpfc/lpfc_debugfs.c:4488:12: note: called from here pentry = lpfc_sli4_qe(pque, index); ^~~~~~~~~~~~~~~~~~~~~~~~~ In file included from drivers/scsi/lpfc/lpfc_debugfs.c:46: drivers/scsi/lpfc/lpfc_sli4.h:1083:14: error: inlining failed in call to always_inline 'lpfc_sli4_qe': function body not available inline void *lpfc_sli4_qe(struct lpfc_queue *, uint16_t); ^~~~~~~~~~~~ drivers/scsi/lpfc/lpfc_debugfs.c:4488:12: note: called from here pentry = lpfc_sli4_qe(pque, index); ^~~~~~~~~~~~~~~~~~~~~~~~~ You can't declare a function inline in a header if it doesn't have a body available to the compiler. So realistically you either don't declare it inline or you make it a static inline in the header. I think the latter applies in this case, so this should be the fix James --- diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 6fc9ef888813..d6ea0c473ed7 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c @@ -14574,12 +14574,6 @@ lpfc_sli4_queue_alloc(struct lpfc_hba *phba, uint32_t page_size, return NULL; } -inline void *lpfc_sli4_qe(struct lpfc_queue *q, uint16_t idx) -{ - return q->q_pgs[idx / q->entry_cnt_per_pg] + - (q->entry_size * (idx % q->entry_cnt_per_pg)); -} - /** * lpfc_dual_chute_pci_bar_map - Map pci base address register to host memory * @phba: HBA structure that indicates port to create a queue on. diff --git a/drivers/scsi/lpfc/lpfc_sli4.h b/drivers/scsi/lpfc/lpfc_sli4.h index bd5b5c3de35e..20bc6d3d0653 100644 --- a/drivers/scsi/lpfc/lpfc_sli4.h +++ b/drivers/scsi/lpfc/lpfc_sli4.h @@ -1080,4 +1080,8 @@ int lpfc_sli4_post_status_check(struct lpfc_hba *); uint8_t lpfc_sli_config_mbox_subsys_get(struct lpfc_hba *, LPFC_MBOXQ_t *); uint8_t lpfc_sli_config_mbox_opcode_get(struct lpfc_hba *, LPFC_MBOXQ_t *); void lpfc_sli4_ras_dma_free(struct lpfc_hba *phba); -inline void *lpfc_sli4_qe(struct lpfc_queue *, uint16_t); +static inline void *lpfc_sli4_qe(struct lpfc_queue *q, uint16_t idx) +{ + return q->q_pgs[idx / q->entry_cnt_per_pg] + + (q->entry_size * (idx % q->entry_cnt_per_pg)); +}