@@ -482,7 +482,7 @@ int ionic_cq_init(struct ionic_lif *lif, struct ionic_cq *cq,
482482 cq -> bound_intr = intr ;
483483 cq -> num_descs = num_descs ;
484484 cq -> desc_size = desc_size ;
485- cq -> tail = cq -> info ;
485+ cq -> tail_idx = 0 ;
486486 cq -> done_color = 1 ;
487487
488488 cur = cq -> info ;
@@ -522,15 +522,18 @@ unsigned int ionic_cq_service(struct ionic_cq *cq, unsigned int work_to_do,
522522 ionic_cq_cb cb , ionic_cq_done_cb done_cb ,
523523 void * done_arg )
524524{
525+ struct ionic_cq_info * cq_info ;
525526 unsigned int work_done = 0 ;
526527
527528 if (work_to_do == 0 )
528529 return 0 ;
529530
530- while (cb (cq , cq -> tail )) {
531- if (cq -> tail -> last )
531+ cq_info = & cq -> info [cq -> tail_idx ];
532+ while (cb (cq , cq_info )) {
533+ if (cq -> tail_idx == cq -> num_descs - 1 )
532534 cq -> done_color = !cq -> done_color ;
533- cq -> tail = cq -> tail -> next ;
535+ cq -> tail_idx = (cq -> tail_idx + 1 ) & (cq -> num_descs - 1 );
536+ cq_info = & cq -> info [cq -> tail_idx ];
534537 DEBUG_STATS_CQE_CNT (cq );
535538
536539 if (++ work_done >= work_to_do )
@@ -565,8 +568,8 @@ int ionic_q_init(struct ionic_lif *lif, struct ionic_dev *idev,
565568 q -> num_descs = num_descs ;
566569 q -> desc_size = desc_size ;
567570 q -> sg_desc_size = sg_desc_size ;
568- q -> tail = q -> info ;
569- q -> head = q -> tail ;
571+ q -> tail_idx = 0 ;
572+ q -> head_idx = 0 ;
570573 q -> pid = pid ;
571574
572575 snprintf (q -> name , sizeof (q -> name ), "L%d-%s%u" , lif -> index , name , index );
@@ -614,28 +617,31 @@ void ionic_q_post(struct ionic_queue *q, bool ring_doorbell, ionic_desc_cb cb,
614617 void * cb_arg )
615618{
616619 struct device * dev = q -> lif -> ionic -> dev ;
620+ struct ionic_desc_info * desc_info ;
617621 struct ionic_lif * lif = q -> lif ;
618622
619- q -> head -> cb = cb ;
620- q -> head -> cb_arg = cb_arg ;
621- q -> head = q -> head -> next ;
623+ desc_info = & q -> info [q -> head_idx ];
624+ desc_info -> cb = cb ;
625+ desc_info -> cb_arg = cb_arg ;
626+
627+ q -> head_idx = (q -> head_idx + 1 ) & (q -> num_descs - 1 );
622628
623629 dev_dbg (dev , "lif=%d qname=%s qid=%d qtype=%d p_index=%d ringdb=%d\n" ,
624630 q -> lif -> index , q -> name , q -> hw_type , q -> hw_index ,
625- q -> head -> index , ring_doorbell );
631+ q -> head_idx , ring_doorbell );
626632
627633 if (ring_doorbell )
628634 ionic_dbell_ring (lif -> kern_dbpage , q -> hw_type ,
629- q -> dbval | q -> head -> index );
635+ q -> dbval | q -> head_idx );
630636}
631637
632638static bool ionic_q_is_posted (struct ionic_queue * q , unsigned int pos )
633639{
634640 unsigned int mask , tail , head ;
635641
636642 mask = q -> num_descs - 1 ;
637- tail = q -> tail -> index ;
638- head = q -> head -> index ;
643+ tail = q -> tail_idx ;
644+ head = q -> head_idx ;
639645
640646 return ((pos - tail ) & mask ) < ((head - tail ) & mask );
641647}
@@ -648,18 +654,18 @@ void ionic_q_service(struct ionic_queue *q, struct ionic_cq_info *cq_info,
648654 void * cb_arg ;
649655
650656 /* check for empty queue */
651- if (q -> tail -> index == q -> head -> index )
657+ if (q -> tail_idx == q -> head_idx )
652658 return ;
653659
654660 /* stop index must be for a descriptor that is not yet completed */
655661 if (unlikely (!ionic_q_is_posted (q , stop_index )))
656662 dev_err (q -> lif -> ionic -> dev ,
657663 "ionic stop is not posted %s stop %u tail %u head %u\n" ,
658- q -> name , stop_index , q -> tail -> index , q -> head -> index );
664+ q -> name , stop_index , q -> tail_idx , q -> head_idx );
659665
660666 do {
661- desc_info = q -> tail ;
662- q -> tail = desc_info -> next ;
667+ desc_info = & q -> info [ q -> tail_idx ] ;
668+ q -> tail_idx = ( q -> tail_idx + 1 ) & ( q -> num_descs - 1 ) ;
663669
664670 cb = desc_info -> cb ;
665671 cb_arg = desc_info -> cb_arg ;
0 commit comments