scsi: fcoe: Use per-CPU API to update per-CPU statistics
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Fri, 6 May 2022 10:57:56 +0000 (12:57 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 17 May 2022 01:26:50 +0000 (21:26 -0400)
The per-CPU statistics (struct fc_stats) is updated by getting a stable
per-CPU pointer via get_cpu() + per_cpu_ptr() and then performing the
increment. This can be optimized by using this_cpu_*() which will do
whatever is needed on the architecture to perform the update safe and
efficient.  The read out of the individual value (fc_get_host_stats())
should be done by using READ_ONCE() instead of a plain-C access. The
difference is that READ_ONCE() will always perform a single access while
the plain-C access can be split by the compiler into two loads if it
appears beneficial.  The usage of u64 has the side-effect that it is also
64bit wide on 32bit architectures and the read is always split into two
loads. The can lead to strange values if the read happens during an update
which alters both 32bit parts of the 64bit value. This can be circumvented
by either using a 32bit variables on 32bit architecures or extending the
statistics with a sequence counter.

Use this_cpu_*() API to update the statistics and READ_ONCE() to read it.

Link: https://lore.kernel.org/r/20220506105758.283887-3-bigeasy@linutronix.de
Reviewed-by: Davidlohr Bueso <dave@stgolabs.net>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/bnx2fc/bnx2fc_fcoe.c
drivers/scsi/bnx2fc/bnx2fc_io.c
drivers/scsi/fcoe/fcoe.c
drivers/scsi/fcoe/fcoe_ctlr.c
drivers/scsi/fcoe/fcoe_transport.c
drivers/scsi/libfc/fc_fcp.c
drivers/scsi/libfc/fc_lport.c
drivers/scsi/qedf/qedf_main.c

index d295867..05ddbb9 100644 (file)
@@ -273,7 +273,6 @@ static int bnx2fc_xmit(struct fc_lport *lport, struct fc_frame *fp)
        struct fcoe_port        *port;
        struct fcoe_hdr         *hp;
        struct bnx2fc_rport     *tgt;
-       struct fc_stats         *stats;
        u8                      sof, eof;
        u32                     crc;
        unsigned int            hlen, tlen, elen;
@@ -399,10 +398,8 @@ static int bnx2fc_xmit(struct fc_lport *lport, struct fc_frame *fp)
        }
 
        /*update tx stats */
-       stats = per_cpu_ptr(lport->stats, get_cpu());
-       stats->TxFrames++;
-       stats->TxWords += wlen;
-       put_cpu();
+       this_cpu_inc(lport->stats->TxFrames);
+       this_cpu_add(lport->stats->TxWords, wlen);
 
        /* send down to lld */
        fr_dev(fp) = lport;
@@ -512,7 +509,6 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
        u32 fr_len, fr_crc;
        struct fc_lport *lport;
        struct fcoe_rcv_info *fr;
-       struct fc_stats *stats;
        struct fc_frame_header *fh;
        struct fcoe_crc_eof crc_eof;
        struct fc_frame *fp;
@@ -543,10 +539,8 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
        skb_pull(skb, sizeof(struct fcoe_hdr));
        fr_len = skb->len - sizeof(struct fcoe_crc_eof);
 
-       stats = per_cpu_ptr(lport->stats, get_cpu());
-       stats->RxFrames++;
-       stats->RxWords += fr_len / FCOE_WORD_TO_BYTE;
-       put_cpu();
+       this_cpu_inc(lport->stats->RxFrames);
+       this_cpu_add(lport->stats->RxWords, fr_len / FCOE_WORD_TO_BYTE);
 
        fp = (struct fc_frame *)skb;
        fc_frame_init(fp);
@@ -633,9 +627,7 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
        fr_crc = le32_to_cpu(fr_crc(fp));
 
        if (unlikely(fr_crc != ~crc32(~0, skb->data, fr_len))) {
-               stats = per_cpu_ptr(lport->stats, get_cpu());
-               crc_err = (stats->InvalidCRCCount++);
-               put_cpu();
+               crc_err = this_cpu_inc_return(lport->stats->InvalidCRCCount);
                if (crc_err < 5)
                        printk(KERN_WARNING PFX "dropping frame with "
                               "CRC error\n");
@@ -964,9 +956,7 @@ static void bnx2fc_indicate_netevent(void *context, unsigned long event,
                                mutex_unlock(&lport->lp_mutex);
                                fc_host_port_type(lport->host) =
                                        FC_PORTTYPE_UNKNOWN;
-                               per_cpu_ptr(lport->stats,
-                                           get_cpu())->LinkFailureCount++;
-                               put_cpu();
+                               this_cpu_inc(lport->stats->LinkFailureCount);
                                fcoe_clean_pending_queue(lport);
                                wait_for_upload = 1;
                        }
index 962454f..6a1fc35 100644 (file)
@@ -2032,7 +2032,6 @@ int bnx2fc_post_io_req(struct bnx2fc_rport *tgt,
        struct bnx2fc_interface *interface = port->priv;
        struct bnx2fc_hba *hba = interface->hba;
        struct fc_lport *lport = port->lport;
-       struct fc_stats *stats;
        int task_idx, index;
        u16 xid;
 
@@ -2045,20 +2044,18 @@ int bnx2fc_post_io_req(struct bnx2fc_rport *tgt,
        io_req->data_xfer_len = scsi_bufflen(sc_cmd);
        bnx2fc_priv(sc_cmd)->io_req = io_req;
 
-       stats = per_cpu_ptr(lport->stats, get_cpu());
        if (sc_cmd->sc_data_direction == DMA_FROM_DEVICE) {
                io_req->io_req_flags = BNX2FC_READ;
-               stats->InputRequests++;
-               stats->InputBytes += io_req->data_xfer_len;
+               this_cpu_inc(lport->stats->InputRequests);
+               this_cpu_add(lport->stats->InputBytes, io_req->data_xfer_len);
        } else if (sc_cmd->sc_data_direction == DMA_TO_DEVICE) {
                io_req->io_req_flags = BNX2FC_WRITE;
-               stats->OutputRequests++;
-               stats->OutputBytes += io_req->data_xfer_len;
+               this_cpu_inc(lport->stats->OutputRequests);
+               this_cpu_add(lport->stats->OutputBytes, io_req->data_xfer_len);
        } else {
                io_req->io_req_flags = 0;
-               stats->ControlRequests++;
+               this_cpu_inc(lport->stats->ControlRequests);
        }
-       put_cpu();
 
        xid = io_req->xid;
 
index af9b788..8bff94b 100644 (file)
@@ -1434,8 +1434,7 @@ static int fcoe_rcv(struct sk_buff *skb, struct net_device *netdev,
 
        return NET_RX_SUCCESS;
 err:
-       per_cpu_ptr(lport->stats, get_cpu())->ErrorFrames++;
-       put_cpu();
+       this_cpu_inc(lport->stats->ErrorFrames);
 err2:
        kfree_skb(skb);
        return NET_RX_DROP;
@@ -1475,7 +1474,6 @@ static int fcoe_xmit(struct fc_lport *lport, struct fc_frame *fp)
        struct ethhdr *eh;
        struct fcoe_crc_eof *cp;
        struct sk_buff *skb;
-       struct fc_stats *stats;
        struct fc_frame_header *fh;
        unsigned int hlen;              /* header length implies the version */
        unsigned int tlen;              /* trailer length */
@@ -1586,10 +1584,8 @@ static int fcoe_xmit(struct fc_lport *lport, struct fc_frame *fp)
                skb_shinfo(skb)->gso_size = 0;
        }
        /* update tx stats: regardless if LLD fails */
-       stats = per_cpu_ptr(lport->stats, get_cpu());
-       stats->TxFrames++;
-       stats->TxWords += wlen;
-       put_cpu();
+       this_cpu_inc(lport->stats->TxFrames);
+       this_cpu_add(lport->stats->TxWords, wlen);
 
        /* send down to lld */
        fr_dev(fp) = lport;
@@ -1611,7 +1607,6 @@ static inline int fcoe_filter_frames(struct fc_lport *lport,
        struct fcoe_interface *fcoe;
        struct fc_frame_header *fh;
        struct sk_buff *skb = (struct sk_buff *)fp;
-       struct fc_stats *stats;
 
        /*
         * We only check CRC if no offload is available and if it is
@@ -1641,11 +1636,8 @@ static inline int fcoe_filter_frames(struct fc_lport *lport,
                return 0;
        }
 
-       stats = per_cpu_ptr(lport->stats, get_cpu());
-       stats->InvalidCRCCount++;
-       if (stats->InvalidCRCCount < 5)
+       if (this_cpu_inc_return(lport->stats->InvalidCRCCount) < 5)
                printk(KERN_WARNING "fcoe: dropping frame with CRC error\n");
-       put_cpu();
        return -EINVAL;
 }
 
@@ -1658,7 +1650,6 @@ static void fcoe_recv_frame(struct sk_buff *skb)
        u32 fr_len;
        struct fc_lport *lport;
        struct fcoe_rcv_info *fr;
-       struct fc_stats *stats;
        struct fcoe_crc_eof crc_eof;
        struct fc_frame *fp;
        struct fcoe_hdr *hp;
@@ -1686,9 +1677,11 @@ static void fcoe_recv_frame(struct sk_buff *skb)
         */
        hp = (struct fcoe_hdr *) skb_network_header(skb);
 
-       stats = per_cpu_ptr(lport->stats, get_cpu());
        if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) {
-               if (stats->ErrorFrames < 5)
+               struct fc_stats *stats;
+
+               stats = per_cpu_ptr(lport->stats, raw_smp_processor_id());
+               if (READ_ONCE(stats->ErrorFrames) < 5)
                        printk(KERN_WARNING "fcoe: FCoE version "
                               "mismatch: The frame has "
                               "version %x, but the "
@@ -1701,8 +1694,8 @@ static void fcoe_recv_frame(struct sk_buff *skb)
        skb_pull(skb, sizeof(struct fcoe_hdr));
        fr_len = skb->len - sizeof(struct fcoe_crc_eof);
 
-       stats->RxFrames++;
-       stats->RxWords += fr_len / FCOE_WORD_TO_BYTE;
+       this_cpu_inc(lport->stats->RxFrames);
+       this_cpu_add(lport->stats->RxWords, fr_len / FCOE_WORD_TO_BYTE);
 
        fp = (struct fc_frame *)skb;
        fc_frame_init(fp);
@@ -1718,13 +1711,11 @@ static void fcoe_recv_frame(struct sk_buff *skb)
                goto drop;
 
        if (!fcoe_filter_frames(lport, fp)) {
-               put_cpu();
                fc_exch_recv(lport, fp);
                return;
        }
 drop:
-       stats->ErrorFrames++;
-       put_cpu();
+       this_cpu_inc(lport->stats->ErrorFrames);
        kfree_skb(skb);
 }
 
@@ -1848,7 +1839,6 @@ static int fcoe_device_notification(struct notifier_block *notifier,
        struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
        struct fcoe_ctlr *ctlr;
        struct fcoe_interface *fcoe;
-       struct fc_stats *stats;
        u32 link_possible = 1;
        u32 mfs;
        int rc = NOTIFY_OK;
@@ -1922,9 +1912,7 @@ static int fcoe_device_notification(struct notifier_block *notifier,
                        break;
                case FCOE_CTLR_ENABLED:
                case FCOE_CTLR_UNUSED:
-                       stats = per_cpu_ptr(lport->stats, get_cpu());
-                       stats->LinkFailureCount++;
-                       put_cpu();
+                       this_cpu_inc(lport->stats->LinkFailureCount);
                        fcoe_clean_pending_queue(lport);
                }
        }
index 1756a0a..8bf7065 100644 (file)
@@ -824,22 +824,21 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip)
        unsigned long deadline;
        unsigned long sel_time = 0;
        struct list_head del_list;
-       struct fc_stats *stats;
 
        INIT_LIST_HEAD(&del_list);
 
-       stats = per_cpu_ptr(fip->lp->stats, get_cpu());
-
        list_for_each_entry_safe(fcf, next, &fip->fcfs, list) {
                deadline = fcf->time + fcf->fka_period + fcf->fka_period / 2;
                if (fip->sel_fcf == fcf) {
                        if (time_after(jiffies, deadline)) {
-                               stats->MissDiscAdvCount++;
+                               u64 miss_cnt;
+
+                               miss_cnt = this_cpu_inc_return(fip->lp->stats->MissDiscAdvCount);
                                printk(KERN_INFO "libfcoe: host%d: "
                                       "Missing Discovery Advertisement "
                                       "for fab %16.16llx count %lld\n",
                                       fip->lp->host->host_no, fcf->fabric_name,
-                                      stats->MissDiscAdvCount);
+                                      miss_cnt);
                        } else if (time_after(next_timer, deadline))
                                next_timer = deadline;
                }
@@ -855,7 +854,7 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip)
                         */
                        list_del(&fcf->list);
                        list_add(&fcf->list, &del_list);
-                       stats->VLinkFailureCount++;
+                       this_cpu_inc(fip->lp->stats->VLinkFailureCount);
                } else {
                        if (time_after(next_timer, deadline))
                                next_timer = deadline;
@@ -864,7 +863,6 @@ static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip)
                                sel_time = fcf->time;
                }
        }
-       put_cpu();
 
        list_for_each_entry_safe(fcf, next, &del_list, list) {
                /* Removes fcf from current list */
@@ -1142,7 +1140,6 @@ static void fcoe_ctlr_recv_els(struct fcoe_ctlr *fip, struct sk_buff *skb)
        struct fip_desc *desc;
        struct fip_encaps *els;
        struct fcoe_fcf *sel;
-       struct fc_stats *stats;
        enum fip_desc_type els_dtype = 0;
        u8 els_op;
        u8 sub;
@@ -1286,10 +1283,8 @@ static void fcoe_ctlr_recv_els(struct fcoe_ctlr *fip, struct sk_buff *skb)
        fr_dev(fp) = lport;
        fr_encaps(fp) = els_dtype;
 
-       stats = per_cpu_ptr(lport->stats, get_cpu());
-       stats->RxFrames++;
-       stats->RxWords += skb->len / FIP_BPW;
-       put_cpu();
+       this_cpu_inc(lport->stats->RxFrames);
+       this_cpu_add(lport->stats->RxWords, skb->len / FIP_BPW);
 
        fc_exch_recv(lport, fp);
        return;
@@ -1427,9 +1422,7 @@ static void fcoe_ctlr_recv_clr_vlink(struct fcoe_ctlr *fip,
                                                      ntoh24(vp->fd_fc_id));
                        if (vn_port && (vn_port == lport)) {
                                mutex_lock(&fip->ctlr_mutex);
-                               per_cpu_ptr(lport->stats,
-                                           get_cpu())->VLinkFailureCount++;
-                               put_cpu();
+                               this_cpu_inc(lport->stats->VLinkFailureCount);
                                fcoe_ctlr_reset(fip);
                                mutex_unlock(&fip->ctlr_mutex);
                        }
@@ -1457,8 +1450,7 @@ static void fcoe_ctlr_recv_clr_vlink(struct fcoe_ctlr *fip,
                 * followed by physical port
                 */
                mutex_lock(&fip->ctlr_mutex);
-               per_cpu_ptr(lport->stats, get_cpu())->VLinkFailureCount++;
-               put_cpu();
+               this_cpu_inc(lport->stats->VLinkFailureCount);
                fcoe_ctlr_reset(fip);
                mutex_unlock(&fip->ctlr_mutex);
 
index 4d0e19e..62341c6 100644 (file)
@@ -183,9 +183,9 @@ void __fcoe_get_lesb(struct fc_lport *lport,
        memset(lesb, 0, sizeof(*lesb));
        for_each_possible_cpu(cpu) {
                stats = per_cpu_ptr(lport->stats, cpu);
-               lfc += stats->LinkFailureCount;
-               vlfc += stats->VLinkFailureCount;
-               mdac += stats->MissDiscAdvCount;
+               lfc += READ_ONCE(stats->LinkFailureCount);
+               vlfc += READ_ONCE(stats->VLinkFailureCount);
+               mdac += READ_ONCE(stats->MissDiscAdvCount);
        }
        lesb->lesb_link_fail = htonl(lfc);
        lesb->lesb_vlink_fail = htonl(vlfc);
index bce90eb..945adca 100644 (file)
@@ -143,8 +143,7 @@ static struct fc_fcp_pkt *fc_fcp_pkt_alloc(struct fc_lport *lport, gfp_t gfp)
                INIT_LIST_HEAD(&fsp->list);
                spin_lock_init(&fsp->scsi_pkt_lock);
        } else {
-               per_cpu_ptr(lport->stats, get_cpu())->FcpPktAllocFails++;
-               put_cpu();
+               this_cpu_inc(lport->stats->FcpPktAllocFails);
        }
        return fsp;
 }
@@ -266,8 +265,7 @@ static int fc_fcp_send_abort(struct fc_fcp_pkt *fsp)
        if (!fsp->seq_ptr)
                return -EINVAL;
 
-       per_cpu_ptr(fsp->lp->stats, get_cpu())->FcpPktAborts++;
-       put_cpu();
+       this_cpu_inc(fsp->lp->stats->FcpPktAborts);
 
        fsp->state |= FC_SRB_ABORT_PENDING;
        rc = fc_seq_exch_abort(fsp->seq_ptr, 0);
@@ -436,8 +434,7 @@ static inline struct fc_frame *fc_fcp_frame_alloc(struct fc_lport *lport,
        if (likely(fp))
                return fp;
 
-       per_cpu_ptr(lport->stats, get_cpu())->FcpFrameAllocFails++;
-       put_cpu();
+       this_cpu_inc(lport->stats->FcpFrameAllocFails);
        /* error case */
        fc_fcp_can_queue_ramp_down(lport);
        shost_printk(KERN_ERR, lport->host,
@@ -471,7 +468,6 @@ static void fc_fcp_recv_data(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
 {
        struct scsi_cmnd *sc = fsp->cmd;
        struct fc_lport *lport = fsp->lp;
-       struct fc_stats *stats;
        struct fc_frame_header *fh;
        size_t start_offset;
        size_t offset;
@@ -533,14 +529,12 @@ static void fc_fcp_recv_data(struct fc_fcp_pkt *fsp, struct fc_frame *fp)
 
                if (~crc != le32_to_cpu(fr_crc(fp))) {
 crc_err:
-                       stats = per_cpu_ptr(lport->stats, get_cpu());
-                       stats->ErrorFrames++;
+                       this_cpu_inc(lport->stats->ErrorFrames);
                        /* per cpu count, not total count, but OK for limit */
-                       if (stats->InvalidCRCCount++ < FC_MAX_ERROR_CNT)
+                       if (this_cpu_inc_return(lport->stats->InvalidCRCCount) < FC_MAX_ERROR_CNT)
                                printk(KERN_WARNING "libfc: CRC error on data "
                                       "frame for port (%6.6x)\n",
                                       lport->port_id);
-                       put_cpu();
                        /*
                         * Assume the frame is total garbage.
                         * We may have copied it over the good part
@@ -1861,7 +1855,6 @@ int fc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *sc_cmd)
        struct fc_fcp_pkt *fsp;
        int rval;
        int rc = 0;
-       struct fc_stats *stats;
 
        rval = fc_remote_port_chkready(rport);
        if (rval) {
@@ -1913,20 +1906,18 @@ int fc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *sc_cmd)
        /*
         * setup the data direction
         */
-       stats = per_cpu_ptr(lport->stats, get_cpu());
        if (sc_cmd->sc_data_direction == DMA_FROM_DEVICE) {
                fsp->req_flags = FC_SRB_READ;
-               stats->InputRequests++;
-               stats->InputBytes += fsp->data_len;
+               this_cpu_inc(lport->stats->InputRequests);
+               this_cpu_add(lport->stats->InputBytes, fsp->data_len);
        } else if (sc_cmd->sc_data_direction == DMA_TO_DEVICE) {
                fsp->req_flags = FC_SRB_WRITE;
-               stats->OutputRequests++;
-               stats->OutputBytes += fsp->data_len;
+               this_cpu_inc(lport->stats->OutputRequests);
+               this_cpu_add(lport->stats->OutputBytes, fsp->data_len);
        } else {
                fsp->req_flags = 0;
-               stats->ControlRequests++;
+               this_cpu_inc(lport->stats->ControlRequests);
        }
-       put_cpu();
 
        /*
         * send it to the lower layer
index 19cd4a9..9c02c95 100644 (file)
@@ -308,21 +308,21 @@ struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost)
 
                stats = per_cpu_ptr(lport->stats, cpu);
 
-               fc_stats->tx_frames += stats->TxFrames;
-               fc_stats->tx_words += stats->TxWords;
-               fc_stats->rx_frames += stats->RxFrames;
-               fc_stats->rx_words += stats->RxWords;
-               fc_stats->error_frames += stats->ErrorFrames;
-               fc_stats->invalid_crc_count += stats->InvalidCRCCount;
-               fc_stats->fcp_input_requests += stats->InputRequests;
-               fc_stats->fcp_output_requests += stats->OutputRequests;
-               fc_stats->fcp_control_requests += stats->ControlRequests;
-               fcp_in_bytes += stats->InputBytes;
-               fcp_out_bytes += stats->OutputBytes;
-               fc_stats->fcp_packet_alloc_failures += stats->FcpPktAllocFails;
-               fc_stats->fcp_packet_aborts += stats->FcpPktAborts;
-               fc_stats->fcp_frame_alloc_failures += stats->FcpFrameAllocFails;
-               fc_stats->link_failure_count += stats->LinkFailureCount;
+               fc_stats->tx_frames += READ_ONCE(stats->TxFrames);
+               fc_stats->tx_words += READ_ONCE(stats->TxWords);
+               fc_stats->rx_frames += READ_ONCE(stats->RxFrames);
+               fc_stats->rx_words += READ_ONCE(stats->RxWords);
+               fc_stats->error_frames += READ_ONCE(stats->ErrorFrames);
+               fc_stats->invalid_crc_count += READ_ONCE(stats->InvalidCRCCount);
+               fc_stats->fcp_input_requests += READ_ONCE(stats->InputRequests);
+               fc_stats->fcp_output_requests += READ_ONCE(stats->OutputRequests);
+               fc_stats->fcp_control_requests += READ_ONCE(stats->ControlRequests);
+               fcp_in_bytes += READ_ONCE(stats->InputBytes);
+               fcp_out_bytes += READ_ONCE(stats->OutputBytes);
+               fc_stats->fcp_packet_alloc_failures += READ_ONCE(stats->FcpPktAllocFails);
+               fc_stats->fcp_packet_aborts += READ_ONCE(stats->FcpPktAborts);
+               fc_stats->fcp_frame_alloc_failures += READ_ONCE(stats->FcpFrameAllocFails);
+               fc_stats->link_failure_count += READ_ONCE(stats->LinkFailureCount);
        }
        fc_stats->fcp_input_megabytes = div_u64(fcp_in_bytes, 1000000);
        fc_stats->fcp_output_megabytes = div_u64(fcp_out_bytes, 1000000);
index cbe0191..3d6b137 100644 (file)
@@ -1067,7 +1067,6 @@ static int qedf_xmit(struct fc_lport *lport, struct fc_frame *fp)
        u32                     crc;
        unsigned int            hlen, tlen, elen;
        int                     wlen;
-       struct fc_stats         *stats;
        struct fc_lport *tmp_lport;
        struct fc_lport *vn_port = NULL;
        struct qedf_rport *fcport;
@@ -1215,10 +1214,8 @@ static int qedf_xmit(struct fc_lport *lport, struct fc_frame *fp)
        hp->fcoe_sof = sof;
 
        /*update tx stats */
-       stats = per_cpu_ptr(lport->stats, get_cpu());
-       stats->TxFrames++;
-       stats->TxWords += wlen;
-       put_cpu();
+       this_cpu_inc(lport->stats->TxFrames);
+       this_cpu_add(lport->stats->TxWords, wlen);
 
        /* Get VLAN ID from skb for printing purposes */
        __vlan_hwaccel_get_tag(skb, &vlan_tci);