Changeset 19079


Ignore:
Timestamp:
2010-01-08T21:22:55+01:00 (8 years ago)
Author:
juhosg
Message:

ar71xx: add NAPI statistics to the ag71xx driver

Location:
trunk/target/linux/ar71xx/files/drivers/net/ag71xx
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx.h

    r19059 r19079  
    120120}; 
    121121 
     122struct ag71xx_napi_stats { 
     123        unsigned long           napi_calls; 
     124        unsigned long           rx_count; 
     125        unsigned long           rx_packets; 
     126        unsigned long           rx_packets_max; 
     127        unsigned long           tx_count; 
     128        unsigned long           tx_packets; 
     129        unsigned long           tx_packets_max; 
     130 
     131        unsigned long           rx[AG71XX_NAPI_WEIGHT + 1]; 
     132        unsigned long           tx[AG71XX_NAPI_WEIGHT + 1]; 
     133}; 
     134 
    122135struct ag71xx_debug { 
    123136        struct dentry           *debugfs_dir; 
    124137        struct dentry           *debugfs_int_stats; 
     138        struct dentry           *debugfs_napi_stats; 
     139 
    125140        struct ag71xx_int_stats int_stats; 
     141        struct ag71xx_napi_stats napi_stats; 
    126142}; 
    127143 
     
    477493void ag71xx_debugfs_exit(struct ag71xx *ag); 
    478494void ag71xx_debugfs_update_int_stats(struct ag71xx *ag, u32 status); 
     495void ag71xx_debugfs_update_napi_stats(struct ag71xx *ag, int rx, int tx); 
    479496#else 
    480497static inline int ag71xx_debugfs_root_init(void) { return 0; } 
     
    483500static inline void ag71xx_debugfs_exit(struct ag71xx *ag) {} 
    484501static inline void ag71xx_debugfs_update_int_stats(struct ag71xx *ag, 
    485                                                  u32 status) {} 
     502                                                   u32 status) {} 
     503static inline void ag71xx_debugfs_update_napi_stats(struct ag71xx *ag, 
     504                                                    int rx, int tx) {} 
    486505#endif /* CONFIG_AG71XX_DEBUG_FS */ 
    487506 
  • trunk/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_debugfs.c

    r19054 r19079  
    7272}; 
    7373 
     74void ag71xx_debugfs_update_napi_stats(struct ag71xx *ag, int rx, int tx) 
     75{ 
     76        struct ag71xx_napi_stats *stats = &ag->debug.napi_stats; 
     77 
     78        if (rx) { 
     79                stats->rx_count++; 
     80                stats->rx_packets += rx; 
     81                if (rx <= AG71XX_NAPI_WEIGHT) 
     82                        stats->rx[rx]++; 
     83                if (rx > stats->rx_packets_max) 
     84                        stats->rx_packets_max = rx; 
     85        } 
     86 
     87        if (tx) { 
     88                stats->tx_count++; 
     89                stats->tx_packets += tx; 
     90                if (tx <= AG71XX_NAPI_WEIGHT) 
     91                        stats->tx[tx]++; 
     92                if (tx > stats->tx_packets_max) 
     93                        stats->tx_packets_max = tx; 
     94        } 
     95} 
     96 
     97static ssize_t read_file_napi_stats(struct file *file, char __user *user_buf, 
     98                                    size_t count, loff_t *ppos) 
     99{ 
     100        struct ag71xx *ag = file->private_data; 
     101        struct ag71xx_napi_stats *stats = &ag->debug.napi_stats; 
     102        char buf[2048]; 
     103        unsigned int len = 0; 
     104        unsigned long rx_avg = 0; 
     105        unsigned long tx_avg = 0; 
     106        int i; 
     107 
     108        if (stats->rx_count) 
     109                rx_avg = stats->rx_packets / stats->rx_count; 
     110 
     111        if (stats->tx_count) 
     112                tx_avg = stats->tx_packets / stats->tx_count; 
     113 
     114        len += snprintf(buf + len, sizeof(buf) - len, "%3s  %10s %10s\n", 
     115                        "len", "rx", "tx"); 
     116 
     117        for (i = 1; i <= AG71XX_NAPI_WEIGHT; i++) 
     118                len += snprintf(buf + len, sizeof(buf) - len, 
     119                                "%3d: %10lu %10lu\n", 
     120                                i, stats->rx[i], stats->tx[i]); 
     121 
     122        len += snprintf(buf + len, sizeof(buf) - len, "\n"); 
     123 
     124        len += snprintf(buf + len, sizeof(buf) - len, "%3s: %10lu %10lu\n", 
     125                        "sum", stats->rx_count, stats->tx_count); 
     126        len += snprintf(buf + len, sizeof(buf) - len, "%3s: %10lu %10lu\n", 
     127                        "avg", rx_avg, tx_avg); 
     128        len += snprintf(buf + len, sizeof(buf) - len, "%3s: %10lu %10lu\n", 
     129                        "max", stats->rx_packets_max, stats->tx_packets_max); 
     130        len += snprintf(buf + len, sizeof(buf) - len, "%3s: %10lu %10lu\n", 
     131                        "pkt", stats->rx_packets, stats->tx_packets); 
     132 
     133        return simple_read_from_buffer(user_buf, count, ppos, buf, len); 
     134} 
     135 
     136static const struct file_operations ag71xx_fops_napi_stats = { 
     137        .open   = ag71xx_debugfs_generic_open, 
     138        .read   = read_file_napi_stats, 
     139        .owner  = THIS_MODULE 
     140}; 
     141 
    74142void ag71xx_debugfs_exit(struct ag71xx *ag) 
    75143{ 
     144        debugfs_remove(ag->debug.debugfs_napi_stats); 
    76145        debugfs_remove(ag->debug.debugfs_int_stats); 
    77146        debugfs_remove(ag->debug.debugfs_dir); 
     
    92161                                            &ag71xx_fops_int_stats); 
    93162        if (!ag->debug.debugfs_int_stats) 
     163                goto err; 
     164 
     165        ag->debug.debugfs_napi_stats = 
     166                        debugfs_create_file("napi_stats", 
     167                                            S_IRUGO, 
     168                                            ag->debug.debugfs_dir, 
     169                                            ag, 
     170                                            &ag71xx_fops_napi_stats); 
     171        if (!ag->debug.debugfs_napi_stats) 
    94172                goto err; 
    95173 
  • trunk/target/linux/ar71xx/files/drivers/net/ag71xx/ag71xx_main.c

    r19054 r19079  
    609609} 
    610610 
    611 static void ag71xx_tx_packets(struct ag71xx *ag) 
     611static int ag71xx_tx_packets(struct ag71xx *ag) 
    612612{ 
    613613        struct ag71xx_ring *ring = &ag->tx_ring; 
    614         unsigned int sent; 
     614        int sent; 
    615615 
    616616        DBG("%s: processing TX ring\n", ag->dev->name); 
     
    642642                netif_wake_queue(ag->dev); 
    643643 
     644        return sent; 
    644645} 
    645646 
     
    712713        unsigned long flags; 
    713714        u32 status; 
    714         int done; 
     715        int tx_done; 
     716        int rx_done; 
    715717 
    716718        pdata->ddr_flush(); 
    717         ag71xx_tx_packets(ag); 
     719        tx_done = ag71xx_tx_packets(ag); 
    718720 
    719721        DBG("%s: processing RX ring\n", dev->name); 
    720         done = ag71xx_rx_packets(ag, limit); 
     722        rx_done = ag71xx_rx_packets(ag, limit); 
     723 
     724        ag71xx_debugfs_update_napi_stats(ag, rx_done, tx_done); 
    721725 
    722726        rx_ring = &ag->rx_ring; 
     
    733737        } 
    734738 
    735         if (done < limit) { 
     739        if (rx_done < limit) { 
    736740                if (status & RX_STATUS_PR) 
    737741                        goto more; 
     
    741745                        goto more; 
    742746 
    743                 DBG("%s: disable polling mode, done=%d, limit=%d\n", 
    744                         dev->name, done, limit); 
     747                DBG("%s: disable polling mode, rx=%d, tx=%d,limit=%d\n", 
     748                        dev->name, rx_done, tx_done, limit); 
    745749 
    746750                napi_complete(napi); 
     
    750754                ag71xx_int_enable(ag, AG71XX_INT_POLL); 
    751755                spin_unlock_irqrestore(&ag->lock, flags); 
    752                 return done; 
     756                return rx_done; 
    753757        } 
    754758 
    755759 more: 
    756         DBG("%s: stay in polling mode, done=%d, limit=%d\n", 
    757                         dev->name, done, limit); 
    758         return done; 
     760        DBG("%s: stay in polling mode, rx=%d, tx=%d, limit=%d\n", 
     761                        dev->name, rx_done, tx_done, limit); 
     762        return rx_done; 
    759763 
    760764 oom: 
Note: See TracChangeset for help on using the changeset viewer.