> 
> Now that fcoe_percpu_s and skb queue related functions are moved to
> libfcoe,
> remove the duplicate code and start using them.
> 
> Signed-off-by: Nithin Nayak Sujir <[email protected]>
> Signed-off-by: Bhanu Prakash Gollapudi <[email protected]>
> ---
>  drivers/scsi/bnx2fc/bnx2fc.h      |   11 +--
>  drivers/scsi/bnx2fc/bnx2fc_fcoe.c |  145 ++++++++-----------------------
> ------
>  drivers/scsi/bnx2fc/bnx2fc_hwi.c  |   12 ++--
>  3 files changed, 39 insertions(+), 129 deletions(-)
> 
> diff --git a/drivers/scsi/bnx2fc/bnx2fc.h b/drivers/scsi/bnx2fc/bnx2fc.h
> index 95f9a5c..f768082 100644
> --- a/drivers/scsi/bnx2fc/bnx2fc.h
> +++ b/drivers/scsi/bnx2fc/bnx2fc.h
> @@ -134,16 +134,11 @@
> 
>  #define BNX2FC_RNID_HBA                      0x7
> 
> -struct bnx2fc_global_s {
> -     struct task_struct *l2_thread;
> -     struct sk_buff_head fcoe_rx_list;
> -     struct page *crc_eof_page;
> -     int crc_eof_offset;
> -};
> -extern struct bnx2fc_global_s bnx2fc_global;
> +/* bnx2fc driver uses only one instance of fcoe_percpu_s */
> +extern struct fcoe_percpu_s bnx2fc_global;
> 
>  struct bnx2fc_percpu_s {
> -     struct task_struct *thread;
> +     struct task_struct *iothread;
>       struct list_head work_list;
>       spinlock_t fp_work_lock;
>  };
> diff --git a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> index e9af99b..68754ab 100644
> --- a/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> +++ b/drivers/scsi/bnx2fc/bnx2fc_fcoe.c
> @@ -34,13 +34,16 @@ MODULE_DESCRIPTION("Broadcom NetXtreme II BCM57710
> FCoE Driver");
>  MODULE_LICENSE("GPL");
>  MODULE_VERSION(DRV_MODULE_VERSION);
> 
> -#define FCOE_LOW_QUEUE_DEPTH 32
>  #define FCOE_WORD_TO_BYTE  4
> 
>  static struct scsi_transport_template        *bnx2fc_transport_template;
>  static struct scsi_transport_template        *bnx2fc_vport_xport_template;
> 
> -struct bnx2fc_global_s bnx2fc_global;
> +/* bnx2fc structure needs only one instance of the fcoe_percpu_s
> structure.
> + * Here the io threads are per cpu but the l2 thread is just one
> + */
> +struct fcoe_percpu_s bnx2fc_global;
> +DEFINE_SPINLOCK(bnx2fc_global_lock);
> 
>  static struct cnic_ulp_ops bnx2fc_cnic_cb;
>  static struct libfc_function_template bnx2fc_libfc_fcn_templ;
> @@ -55,7 +58,6 @@ static int bnx2fc_disable(struct net_device *netdev);
>  static void bnx2fc_recv_frame(struct sk_buff *skb);
> 
>  static void bnx2fc_start_disc(struct bnx2fc_hba *hba);
> -static void bnx2fc_check_wait_queue(struct fc_lport *lp, struct sk_buff
> *skb);
>  static int bnx2fc_shost_config(struct fc_lport *lport, struct device
> *dev);
>  static int bnx2fc_net_config(struct fc_lport *lp);
>  static int bnx2fc_lport_config(struct fc_lport *lport);
> @@ -89,11 +91,9 @@ static struct notifier_block bnx2fc_cpu_notifier = {
>       .notifier_call = bnx2fc_cpu_callback,
>  };
> 
> -#define FCOE_MAX_QUEUE_DEPTH 256
> -
>  static void bnx2fc_clean_rx_queue(struct fc_lport *lp)
>  {
> -     struct bnx2fc_global_s *bg;
> +     struct fcoe_percpu_s *bg;
>       struct fcoe_rcv_info *fr;
>       struct sk_buff_head *list;
>       struct sk_buff *skb, *next;
> @@ -115,99 +115,14 @@ static void bnx2fc_clean_rx_queue(struct fc_lport
> *lp)
>       spin_unlock_bh(&bg->fcoe_rx_list.lock);
>  }
> 
> -static void bnx2fc_queue_timer(ulong lport)
> -{
> -     bnx2fc_check_wait_queue((struct fc_lport *) lport, NULL);
> -}
> -
> -static void bnx2fc_clean_pending_queue(struct fc_lport *lp)
> -{
> -     struct fcoe_port *port;
> -     struct sk_buff *skb;
> -     port = lport_priv(lp);
> -
> -     spin_lock_bh(&port->fcoe_pending_queue.lock);
> -     while ((skb = __skb_dequeue(&port->fcoe_pending_queue)) != NULL) {
> -             spin_unlock_bh(&port->fcoe_pending_queue.lock);
> -             kfree_skb(skb);
> -             spin_lock_bh(&port->fcoe_pending_queue.lock);
> -     }
> -     spin_unlock_bh(&port->fcoe_pending_queue.lock);
> -}
> -
> -static void bnx2fc_check_wait_queue(struct fc_lport *lp, struct sk_buff
> *skb)
> -{
> -     struct fcoe_port *port = lport_priv(lp);
> -     int rc = 0;
> -
> -     spin_lock_bh(&port->fcoe_pending_queue.lock);
> -
> -     if (skb)
> -             __skb_queue_tail(&port->fcoe_pending_queue, skb);
> -
> -     if (port->fcoe_pending_queue_active)
> -             goto out;
> -     port->fcoe_pending_queue_active = 1;
> -
> -     while (port->fcoe_pending_queue.qlen) {
> -             /* keep qlen > 0 until bnx2fc_start_io succeeds */
> -             port->fcoe_pending_queue.qlen++;
> -             skb = __skb_dequeue(&port->fcoe_pending_queue);
> -
> -             spin_unlock_bh(&port->fcoe_pending_queue.lock);
> -             rc = fcoe_start_io(skb);
> -             spin_lock_bh(&port->fcoe_pending_queue.lock);
> -
> -             if (rc) {
> -                     __skb_queue_head(&port->fcoe_pending_queue, skb);
> -                     /* undo temporary increment above */
> -                     port->fcoe_pending_queue.qlen--;
> -                     break;
> -             }
> -             /* undo temporary increment above */
> -             port->fcoe_pending_queue.qlen--;
> -     }
> -
> -     if (port->fcoe_pending_queue.qlen < FCOE_LOW_QUEUE_DEPTH)
> -             lp->qfull = 0;
> -     if (port->fcoe_pending_queue.qlen && !timer_pending(&port->timer))
> -             mod_timer(&port->timer, jiffies + 2);
> -     port->fcoe_pending_queue_active = 0;
> -out:
> -     if (port->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
> -             lp->qfull = 1;
> -     spin_unlock_bh(&port->fcoe_pending_queue.lock);
> -}
> -
>  int bnx2fc_get_paged_crc_eof(struct sk_buff *skb, int tlen)
>  {
> -     struct bnx2fc_global_s *bg;
> -     struct page *page;
> -
> -     bg = &bnx2fc_global;
> -     page = bg->crc_eof_page;
> -     if (!page) {
> -             page = alloc_page(GFP_ATOMIC);
> -             if (!page)
> -                     return -ENOMEM;
> -             bg->crc_eof_page = page;
> -             bg->crc_eof_offset = 0;
> -     }
> -
> -     get_page(page);
> -     skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags, page,
> -                        bg->crc_eof_offset, tlen);
> -     skb->len += tlen;
> -     skb->data_len += tlen;
> -     skb->truesize += tlen;
> -     bg->crc_eof_offset += sizeof(struct fcoe_crc_eof);
> +     int rc;
> +     spin_lock(&bnx2fc_global_lock);
> +     rc = fcoe_get_paged_crc_eof(skb, tlen, &bnx2fc_global);
> +     spin_unlock(&bnx2fc_global_lock);
I did not see where bnx2fc_get_paged_crc_eof() gets called, and it may be
outside the scope of open fcoe protocol stack, but do you really have to take
this spinlock for this?

Thanks,
yi
> 
> -     if (bg->crc_eof_offset >= PAGE_SIZE) {
> -             bg->crc_eof_page = NULL;
> -             bg->crc_eof_offset = 0;
> -             put_page(page);
> -     }
> -     return 0;
> +     return rc;
>  }
> 
>  static void bnx2fc_abort_io(struct fc_lport *lport)
> @@ -434,9 +349,9 @@ static int bnx2fc_xmit(struct fc_lport *lport, struct
> fc_frame *fp)
>       /* send down to lld */
>       fr_dev(fp) = lport;
>       if (port->fcoe_pending_queue.qlen)
> -             bnx2fc_check_wait_queue(lport, skb);
> +             fcoe_check_wait_queue(lport, skb);
>       else if (fcoe_start_io(skb))
> -             bnx2fc_check_wait_queue(lport, skb);
> +             fcoe_check_wait_queue(lport, skb);
> 
>       return 0;
>  }
> @@ -458,7 +373,7 @@ static int bnx2fc_rcv(struct sk_buff *skb, struct
> net_device *dev,
>       struct bnx2fc_hba *hba;
>       struct fc_frame_header *fh;
>       struct fcoe_rcv_info *fr;
> -     struct bnx2fc_global_s *bg;
> +     struct fcoe_percpu_s *bg;
>       unsigned short oxid;
> 
>       hba = container_of(ptype, struct bnx2fc_hba, fcoe_packet_type);
> @@ -496,7 +411,7 @@ static int bnx2fc_rcv(struct sk_buff *skb, struct
> net_device *dev,
> 
>       __skb_queue_tail(&bg->fcoe_rx_list, skb);
>       if (bg->fcoe_rx_list.qlen == 1)
> -             wake_up_process(bg->l2_thread);
> +             wake_up_process(bg->thread);
> 
>       spin_unlock_bh(&bg->fcoe_rx_list.lock);
> 
> @@ -508,7 +423,7 @@ err:
> 
>  static int bnx2fc_l2_rcv_thread(void *arg)
>  {
> -     struct bnx2fc_global_s *bg = arg;
> +     struct fcoe_percpu_s *bg = arg;
>       struct sk_buff *skb;
> 
>       while (!kthread_should_stop()) {
> @@ -808,7 +723,7 @@ static int bnx2fc_net_config(struct fc_lport *lport)
> 
>       skb_queue_head_init(&port->fcoe_pending_queue);
>       port->fcoe_pending_queue_active = 0;
> -     setup_timer(&port->timer, bnx2fc_queue_timer, (unsigned long)
> lport);
> +     setup_timer(&port->timer, fcoe_queue_timer, (unsigned long) lport);
> 
>       if (!lport->vport) {
>               wwnn = fcoe_wwn_from_mac(hba->ctlr.ctl_src_addr, 1, 0);
> @@ -925,7 +840,7 @@ static void bnx2fc_indicate_netevent(void *context,
> unsigned long event)
>                       per_cpu_ptr(lport->dev_stats,
>                                   get_cpu())->LinkFailureCount++;
>                       put_cpu();
> -                     bnx2fc_clean_pending_queue(lport);
> +                     fcoe_clean_pending_queue(lport);
> 
>                       init_waitqueue_head(&hba->shutdown_wait);
>                       BNX2FC_HBA_DBG(lport, "indicate_netevent "
> @@ -1441,7 +1356,7 @@ static void bnx2fc_if_destroy(struct fc_lport
> *lport)
>       del_timer_sync(&port->timer);
> 
>       /* Free existing transmit skbs */
> -     bnx2fc_clean_pending_queue(lport);
> +     fcoe_clean_pending_queue(lport);
> 
>       bnx2fc_interface_put(hba);
> 
> @@ -1893,7 +1808,7 @@ static int bnx2fc_disable(struct net_device
> *netdev)
>               printk(KERN_ERR PFX "bnx2fc_disable: hba not found\n");
>       } else {
>               fcoe_ctlr_link_down(&hba->ctlr);
> -             bnx2fc_clean_pending_queue(hba->ctlr.lp);
> +             fcoe_clean_pending_queue(hba->ctlr.lp);
>       }
> 
>  nodev:
> @@ -2225,9 +2140,9 @@ static void bnx2fc_percpu_thread_create(unsigned
> int cpu)
>                               (void *)p,
>                               "bnx2fc_thread/%d", cpu);
>       /* bind thread to the cpu */
> -     if (likely(!IS_ERR(p->thread))) {
> +     if (likely(!IS_ERR(p->iothread))) {
>               kthread_bind(thread, cpu);
> -             p->thread = thread;
> +             p->iothread = thread;
>               wake_up_process(thread);
>       }
>  }
> @@ -2244,8 +2159,8 @@ static void bnx2fc_percpu_thread_destroy(unsigned
> int cpu)
>       /* Prevent any new work from being queued for this CPU */
>       p = &per_cpu(bnx2fc_percpu, cpu);
>       spin_lock_bh(&p->fp_work_lock);
> -     thread = p->thread;
> -     p->thread = NULL;
> +     thread = p->iothread;
> +     p->iothread = NULL;
> 
> 
>       /* Free all work in the list */
> @@ -2302,7 +2217,7 @@ static int bnx2fc_cpu_callback(struct
> notifier_block *nfb,
>   **/
>  static int __init bnx2fc_mod_init(void)
>  {
> -     struct bnx2fc_global_s *bg;
> +     struct fcoe_percpu_s *bg;
>       struct task_struct *l2_thread;
>       int rc = 0;
>       unsigned int cpu = 0;
> @@ -2333,14 +2248,14 @@ static int __init bnx2fc_mod_init(void)
>       l2_thread = kthread_create(bnx2fc_l2_rcv_thread,
>                                  (void *)bg,
>                                  "bnx2fc_l2_thread");
> -     if (IS_ERR(bg->l2_thread)) {
> +     if (IS_ERR(bg->thread)) {
>               rc = PTR_ERR(l2_thread);
>               fcoe_transport_detach(&bnx2fc_transport);
>               return rc;
>       }
>       wake_up_process(l2_thread);
>       spin_lock_bh(&bg->fcoe_rx_list.lock);
> -     bg->l2_thread = l2_thread;
> +     bg->thread = l2_thread;
>       spin_unlock_bh(&bg->fcoe_rx_list.lock);
> 
>       for_each_possible_cpu(cpu) {
> @@ -2366,7 +2281,7 @@ static void __exit bnx2fc_mod_exit(void)
>  {
>       LIST_HEAD(to_be_deleted);
>       struct bnx2fc_hba *hba, *next;
> -     struct bnx2fc_global_s *bg;
> +     struct fcoe_percpu_s *bg;
>       struct task_struct *l2_thread;
>       struct sk_buff *skb;
>       unsigned int cpu = 0;
> @@ -2400,8 +2315,8 @@ static void __exit bnx2fc_mod_exit(void)
>       /* Destroy global thread */
>       bg = &bnx2fc_global;
>       spin_lock_bh(&bg->fcoe_rx_list.lock);
> -     l2_thread = bg->l2_thread;
> -     bg->l2_thread = NULL;
> +     l2_thread = bg->thread;
> +     bg->thread = NULL;
>       while ((skb = __skb_dequeue(&bg->fcoe_rx_list)) != NULL)
>               kfree_skb(skb);
> 
> diff --git a/drivers/scsi/bnx2fc/bnx2fc_hwi.c
> b/drivers/scsi/bnx2fc/bnx2fc_hwi.c
> index cf56e44..0a0754d 100644
> --- a/drivers/scsi/bnx2fc/bnx2fc_hwi.c
> +++ b/drivers/scsi/bnx2fc/bnx2fc_hwi.c
> @@ -492,7 +492,7 @@ void bnx2fc_process_l2_frame_compl(struct
> bnx2fc_rport *tgt,
>       struct fcoe_hdr *hp;
>       struct fcoe_crc_eof *cp;
>       struct fcoe_rcv_info *fr;
> -     struct bnx2fc_global_s *bg;
> +     struct fcoe_percpu_s *bg;
> 
>       struct sk_buff *skb;
>       unsigned int hlen;      /* header length implies the version */
> @@ -610,7 +610,7 @@ void bnx2fc_process_l2_frame_compl(struct
> bnx2fc_rport *tgt,
>               bg = &bnx2fc_global;
>               spin_lock_bh(&bg->fcoe_rx_list.lock);
> 
> -             if (unlikely(!bg->l2_thread)) {
> +             if (unlikely(!bg->thread)) {
>                       spin_unlock_bh(&bg->fcoe_rx_list.lock);
>                       printk(KERN_ERR PFX "ERROR-thread is NULL\n");
>                       kfree_skb(skb);
> @@ -618,7 +618,7 @@ void bnx2fc_process_l2_frame_compl(struct
> bnx2fc_rport *tgt,
>               }
>               __skb_queue_tail(&bg->fcoe_rx_list, skb);
>               if (bg->fcoe_rx_list.qlen == 1)
> -                     wake_up_process(bg->l2_thread);
> +                     wake_up_process(bg->thread);
>               spin_unlock_bh(&bg->fcoe_rx_list.lock);
>       } else {
>               BNX2FC_HBA_DBG(lport, "fh_r_ctl = 0x%x\n", fh->fh_r_ctl);
> @@ -922,7 +922,7 @@ int bnx2fc_process_new_cqes(struct bnx2fc_rport *tgt)
> 
>                               fps = &per_cpu(bnx2fc_percpu, cpu);
>                               spin_lock_bh(&fps->fp_work_lock);
> -                             if (unlikely(!fps->thread))
> +                             if (unlikely(!fps->iothread))
>                                       goto unlock;
> 
>                               work =  bnx2fc_alloc_work(tgt, wqe);
> @@ -934,8 +934,8 @@ unlock:
>                               spin_unlock_bh(&fps->fp_work_lock);
> 
>                               /* Pending work request completion */
> -                             if (fps->thread && work)
> -                                     wake_up_process(fps->thread);
> +                             if (fps->iothread && work)
> +                                     wake_up_process(fps->iothread);
>                               else
>                                       bnx2fc_process_cq_compl(tgt, wqe);
>                       }
> --
> 1.7.0.6
> 
> 
> 
> 
> _______________________________________________
> devel mailing list
> [email protected]
> https://lists.open-fcoe.org/mailman/listinfo/devel
_______________________________________________
devel mailing list
[email protected]
https://lists.open-fcoe.org/mailman/listinfo/devel

Reply via email to