> On Mar 19, 2019, at 6:02 PM, James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx> wrote: > > 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)); > +} Agree. Thank You James. — james Reviewed-by: James Smart <james.smart@xxxxxxxxxxxx>