S2IO: statistics for memory allocation failuers
1. Added code to count the number of memory failures. 2. Added watchdog_timer counter. 3. Changed debug level for some DBG_PRINTS. Signed-off-by: Sreenivasa Honnur <sreenivasa.honnur@neterion.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
0cec35ebf3
commit
c53d49453f
@ -281,6 +281,8 @@ static char ethtool_driver_stats_keys[][ETH_GSTRING_LEN] = {
|
|||||||
("lro_out_of_sequence_pkts"),
|
("lro_out_of_sequence_pkts"),
|
||||||
("lro_flush_due_to_max_pkts"),
|
("lro_flush_due_to_max_pkts"),
|
||||||
("lro_avg_aggr_pkts"),
|
("lro_avg_aggr_pkts"),
|
||||||
|
("mem_alloc_fail_cnt"),
|
||||||
|
("watchdog_timer_cnt")
|
||||||
};
|
};
|
||||||
|
|
||||||
#define S2IO_XENA_STAT_LEN sizeof(ethtool_xena_stats_keys)/ ETH_GSTRING_LEN
|
#define S2IO_XENA_STAT_LEN sizeof(ethtool_xena_stats_keys)/ ETH_GSTRING_LEN
|
||||||
@ -2186,6 +2188,7 @@ static int fill_rxd_3buf(struct s2io_nic *nic, struct RxD_t *rxdp, struct \
|
|||||||
/* skb_shinfo(skb)->frag_list will have L4 data payload */
|
/* skb_shinfo(skb)->frag_list will have L4 data payload */
|
||||||
skb_shinfo(skb)->frag_list = dev_alloc_skb(dev->mtu + ALIGN_SIZE);
|
skb_shinfo(skb)->frag_list = dev_alloc_skb(dev->mtu + ALIGN_SIZE);
|
||||||
if (skb_shinfo(skb)->frag_list == NULL) {
|
if (skb_shinfo(skb)->frag_list == NULL) {
|
||||||
|
nic->mac_control.stats_info->sw_stat.mem_alloc_fail_cnt++;
|
||||||
DBG_PRINT(INFO_DBG, "%s: dev_alloc_skb failed\n ", dev->name);
|
DBG_PRINT(INFO_DBG, "%s: dev_alloc_skb failed\n ", dev->name);
|
||||||
return -ENOMEM ;
|
return -ENOMEM ;
|
||||||
}
|
}
|
||||||
@ -2319,6 +2322,8 @@ static int fill_rx_buffers(struct s2io_nic *nic, int ring_no)
|
|||||||
wmb();
|
wmb();
|
||||||
first_rxdp->Control_1 |= RXD_OWN_XENA;
|
first_rxdp->Control_1 |= RXD_OWN_XENA;
|
||||||
}
|
}
|
||||||
|
nic->mac_control.stats_info->sw_stat. \
|
||||||
|
mem_alloc_fail_cnt++;
|
||||||
return -ENOMEM ;
|
return -ENOMEM ;
|
||||||
}
|
}
|
||||||
if (nic->rxd_mode == RXD_MODE_1) {
|
if (nic->rxd_mode == RXD_MODE_1) {
|
||||||
@ -3673,6 +3678,7 @@ static int s2io_enable_msi_x(struct s2io_nic *nic)
|
|||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (nic->entries == NULL) {
|
if (nic->entries == NULL) {
|
||||||
DBG_PRINT(INFO_DBG, "%s: Memory allocation failed\n", __FUNCTION__);
|
DBG_PRINT(INFO_DBG, "%s: Memory allocation failed\n", __FUNCTION__);
|
||||||
|
nic->mac_control.stats_info->sw_stat.mem_alloc_fail_cnt++;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
memset(nic->entries, 0, MAX_REQUESTED_MSI_X * sizeof(struct msix_entry));
|
memset(nic->entries, 0, MAX_REQUESTED_MSI_X * sizeof(struct msix_entry));
|
||||||
@ -3682,6 +3688,7 @@ static int s2io_enable_msi_x(struct s2io_nic *nic)
|
|||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (nic->s2io_entries == NULL) {
|
if (nic->s2io_entries == NULL) {
|
||||||
DBG_PRINT(INFO_DBG, "%s: Memory allocation failed\n", __FUNCTION__);
|
DBG_PRINT(INFO_DBG, "%s: Memory allocation failed\n", __FUNCTION__);
|
||||||
|
nic->mac_control.stats_info->sw_stat.mem_alloc_fail_cnt++;
|
||||||
kfree(nic->entries);
|
kfree(nic->entries);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
@ -5015,8 +5022,10 @@ static void s2io_vpd_read(struct s2io_nic *nic)
|
|||||||
strcpy(nic->serial_num, "NOT AVAILABLE");
|
strcpy(nic->serial_num, "NOT AVAILABLE");
|
||||||
|
|
||||||
vpd_data = kmalloc(256, GFP_KERNEL);
|
vpd_data = kmalloc(256, GFP_KERNEL);
|
||||||
if (!vpd_data)
|
if (!vpd_data) {
|
||||||
|
nic->mac_control.stats_info->sw_stat.mem_alloc_fail_cnt++;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < 256; i +=4 ) {
|
for (i = 0; i < 256; i +=4 ) {
|
||||||
pci_write_config_byte(nic->pdev, (vpd_addr + 2), i);
|
pci_write_config_byte(nic->pdev, (vpd_addr + 2), i);
|
||||||
@ -5776,6 +5785,8 @@ static void s2io_get_ethtool_stats(struct net_device *dev,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
tmp_stats[i++] = 0;
|
tmp_stats[i++] = 0;
|
||||||
|
tmp_stats[i++] = stat_info->sw_stat.mem_alloc_fail_cnt;
|
||||||
|
tmp_stats[i++] = stat_info->sw_stat.watchdog_timer_cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int s2io_ethtool_get_regs_len(struct net_device *dev)
|
static int s2io_ethtool_get_regs_len(struct net_device *dev)
|
||||||
@ -6112,7 +6123,10 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,
|
|||||||
*skb = dev_alloc_skb(size);
|
*skb = dev_alloc_skb(size);
|
||||||
if (!(*skb)) {
|
if (!(*skb)) {
|
||||||
DBG_PRINT(INFO_DBG, "%s: Out of ", dev->name);
|
DBG_PRINT(INFO_DBG, "%s: Out of ", dev->name);
|
||||||
DBG_PRINT(INFO_DBG, "memory to allocate SKBs\n");
|
DBG_PRINT(INFO_DBG, "memory to allocate ");
|
||||||
|
DBG_PRINT(INFO_DBG, "1 buf mode SKBs\n");
|
||||||
|
sp->mac_control.stats_info->sw_stat. \
|
||||||
|
mem_alloc_fail_cnt++;
|
||||||
return -ENOMEM ;
|
return -ENOMEM ;
|
||||||
}
|
}
|
||||||
/* storing the mapped addr in a temp variable
|
/* storing the mapped addr in a temp variable
|
||||||
@ -6134,8 +6148,11 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,
|
|||||||
} else {
|
} else {
|
||||||
*skb = dev_alloc_skb(size);
|
*skb = dev_alloc_skb(size);
|
||||||
if (!(*skb)) {
|
if (!(*skb)) {
|
||||||
DBG_PRINT(INFO_DBG, "%s: dev_alloc_skb failed\n",
|
DBG_PRINT(INFO_DBG, "%s: Out of ", dev->name);
|
||||||
dev->name);
|
DBG_PRINT(INFO_DBG, "memory to allocate ");
|
||||||
|
DBG_PRINT(INFO_DBG, "2 buf mode SKBs\n");
|
||||||
|
sp->mac_control.stats_info->sw_stat. \
|
||||||
|
mem_alloc_fail_cnt++;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
((struct RxD3*)rxdp)->Buffer2_ptr = *temp2 =
|
((struct RxD3*)rxdp)->Buffer2_ptr = *temp2 =
|
||||||
@ -6161,8 +6178,11 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,
|
|||||||
} else {
|
} else {
|
||||||
*skb = dev_alloc_skb(size);
|
*skb = dev_alloc_skb(size);
|
||||||
if (!(*skb)) {
|
if (!(*skb)) {
|
||||||
DBG_PRINT(INFO_DBG, "%s: dev_alloc_skb failed\n",
|
DBG_PRINT(INFO_DBG, "%s: Out of ", dev->name);
|
||||||
dev->name);
|
DBG_PRINT(INFO_DBG, "memory to allocate ");
|
||||||
|
DBG_PRINT(INFO_DBG, "3 buf mode SKBs\n");
|
||||||
|
sp->mac_control.stats_info->sw_stat. \
|
||||||
|
mem_alloc_fail_cnt++;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
((struct RxD3*)rxdp)->Buffer0_ptr = *temp0 =
|
((struct RxD3*)rxdp)->Buffer0_ptr = *temp0 =
|
||||||
@ -6182,6 +6202,8 @@ static int set_rxd_buffer_pointer(struct s2io_nic *sp, struct RxD_t *rxdp,
|
|||||||
if (skb_shinfo(*skb)->frag_list == NULL) {
|
if (skb_shinfo(*skb)->frag_list == NULL) {
|
||||||
DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb \
|
DBG_PRINT(ERR_DBG, "%s: dev_alloc_skb \
|
||||||
failed\n ", dev->name);
|
failed\n ", dev->name);
|
||||||
|
sp->mac_control.stats_info->sw_stat. \
|
||||||
|
mem_alloc_fail_cnt++;
|
||||||
return -ENOMEM ;
|
return -ENOMEM ;
|
||||||
}
|
}
|
||||||
frag_list = skb_shinfo(*skb)->frag_list;
|
frag_list = skb_shinfo(*skb)->frag_list;
|
||||||
@ -6601,6 +6623,7 @@ static void s2io_tx_watchdog(struct net_device *dev)
|
|||||||
struct s2io_nic *sp = dev->priv;
|
struct s2io_nic *sp = dev->priv;
|
||||||
|
|
||||||
if (netif_carrier_ok(dev)) {
|
if (netif_carrier_ok(dev)) {
|
||||||
|
sp->mac_control.stats_info->sw_stat.watchdog_timer_cnt++;
|
||||||
schedule_work(&sp->rst_timer_task);
|
schedule_work(&sp->rst_timer_task);
|
||||||
sp->mac_control.stats_info->sw_stat.soft_reset_cnt++;
|
sp->mac_control.stats_info->sw_stat.soft_reset_cnt++;
|
||||||
}
|
}
|
||||||
|
@ -95,6 +95,9 @@ struct swStat {
|
|||||||
unsigned long long flush_max_pkts;
|
unsigned long long flush_max_pkts;
|
||||||
unsigned long long sum_avg_pkts_aggregated;
|
unsigned long long sum_avg_pkts_aggregated;
|
||||||
unsigned long long num_aggregations;
|
unsigned long long num_aggregations;
|
||||||
|
/* Other statistics */
|
||||||
|
unsigned long long mem_alloc_fail_cnt;
|
||||||
|
unsigned long long watchdog_timer_cnt;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Xpak releated alarm and warnings */
|
/* Xpak releated alarm and warnings */
|
||||||
|
Loading…
Reference in New Issue
Block a user