提交 cea395ac 编写于 作者: I Intiyaz Basha 提交者: David S. Miller

liquidio: Added ndo_get_vf_stats support

Added the ndo to gather VF statistics through the PF.

Collect VF statistics via mailbox from VF.
Signed-off-by: NIntiyaz Basha <intiyaz.basha@cavium.com>
Signed-off-by: NFelix Manlunas <felix.manlunas@cavium.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 eaa008d3
master alk-4.19.24 alk-4.19.30 alk-4.19.34 alk-4.19.36 alk-4.19.43 alk-4.19.48 alk-4.19.57 ck-4.19.67 ck-4.19.81 ck-4.19.91 github/fork/deepanshu1422/fix-typo-in-comment github/fork/haosdent/fix-typo linux-next v4.19.91 v4.19.90 v4.19.89 v4.19.88 v4.19.87 v4.19.86 v4.19.85 v4.19.84 v4.19.83 v4.19.82 v4.19.81 v4.19.80 v4.19.79 v4.19.78 v4.19.77 v4.19.76 v4.19.75 v4.19.74 v4.19.73 v4.19.72 v4.19.71 v4.19.70 v4.19.69 v4.19.68 v4.19.67 v4.19.66 v4.19.65 v4.19.64 v4.19.63 v4.19.62 v4.19.61 v4.19.60 v4.19.59 v4.19.58 v4.19.57 v4.19.56 v4.19.55 v4.19.54 v4.19.53 v4.19.52 v4.19.51 v4.19.50 v4.19.49 v4.19.48 v4.19.47 v4.19.46 v4.19.45 v4.19.44 v4.19.43 v4.19.42 v4.19.41 v4.19.40 v4.19.39 v4.19.38 v4.19.37 v4.19.36 v4.19.35 v4.19.34 v4.19.33 v4.19.32 v4.19.31 v4.19.30 v4.19.29 v4.19.28 v4.19.27 v4.19.26 v4.19.25 v4.19.24 v4.19.23 v4.19.22 v4.19.21 v4.19.20 v4.19.19 v4.19.18 v4.19.17 v4.19.16 v4.19.15 v4.19.14 v4.19.13 v4.19.12 v4.19.11 v4.19.10 v4.19.9 v4.19.8 v4.19.7 v4.19.6 v4.19.5 v4.19.4 v4.19.3 v4.19.2 v4.19.1 v4.19 v4.19-rc8 v4.19-rc7 v4.19-rc6 v4.19-rc5 v4.19-rc4 v4.19-rc3 v4.19-rc2 v4.19-rc1 ck-release-21 ck-release-20 ck-release-19.2 ck-release-19.1 ck-release-19 ck-release-18 ck-release-17.2 ck-release-17.1 ck-release-17 ck-release-16 ck-release-15.1 ck-release-15 ck-release-14 ck-release-13.2 ck-release-13 ck-release-12 ck-release-11 ck-release-10 ck-release-9 ck-release-7 alk-release-15 alk-release-14 alk-release-13.2 alk-release-13 alk-release-12 alk-release-11 alk-release-10 alk-release-9 alk-release-7
无相关合并请求
...@@ -1497,3 +1497,57 @@ void cn23xx_tell_vf_its_macaddr_changed(struct octeon_device *oct, int vfidx, ...@@ -1497,3 +1497,57 @@ void cn23xx_tell_vf_its_macaddr_changed(struct octeon_device *oct, int vfidx,
octeon_mbox_write(oct, &mbox_cmd); octeon_mbox_write(oct, &mbox_cmd);
} }
} }
static void
cn23xx_get_vf_stats_callback(struct octeon_device *oct,
struct octeon_mbox_cmd *cmd, void *arg)
{
struct oct_vf_stats_ctx *ctx = arg;
memcpy(ctx->stats, cmd->data, sizeof(struct oct_vf_stats));
atomic_set(&ctx->status, 1);
}
int cn23xx_get_vf_stats(struct octeon_device *oct, int vfidx,
struct oct_vf_stats *stats)
{
u32 timeout = HZ; // 1sec
struct octeon_mbox_cmd mbox_cmd;
struct oct_vf_stats_ctx ctx;
u32 count = 0, ret;
if (!(oct->sriov_info.vf_drv_loaded_mask & (1ULL << vfidx)))
return -1;
if (sizeof(struct oct_vf_stats) > sizeof(mbox_cmd.data))
return -1;
mbox_cmd.msg.u64 = 0;
mbox_cmd.msg.s.type = OCTEON_MBOX_REQUEST;
mbox_cmd.msg.s.resp_needed = 1;
mbox_cmd.msg.s.cmd = OCTEON_GET_VF_STATS;
mbox_cmd.msg.s.len = 1;
mbox_cmd.q_no = vfidx * oct->sriov_info.rings_per_vf;
mbox_cmd.recv_len = 0;
mbox_cmd.recv_status = 0;
mbox_cmd.fn = (octeon_mbox_callback_t)cn23xx_get_vf_stats_callback;
ctx.stats = stats;
atomic_set(&ctx.status, 0);
mbox_cmd.fn_arg = (void *)&ctx;
memset(mbox_cmd.data, 0, sizeof(mbox_cmd.data));
octeon_mbox_write(oct, &mbox_cmd);
do {
schedule_timeout_uninterruptible(1);
} while ((atomic_read(&ctx.status) == 0) && (count++ < timeout));
ret = atomic_read(&ctx.status);
if (ret == 0) {
octeon_mbox_cancel(oct, 0);
dev_err(&oct->pci_dev->dev, "Unable to get stats from VF-%d, timedout\n",
vfidx);
return -1;
}
return 0;
}
...@@ -43,6 +43,15 @@ struct octeon_cn23xx_pf { ...@@ -43,6 +43,15 @@ struct octeon_cn23xx_pf {
#define CN23XX_SLI_DEF_BP 0x40 #define CN23XX_SLI_DEF_BP 0x40
struct oct_vf_stats {
u64 rx_packets;
u64 tx_packets;
u64 rx_bytes;
u64 tx_bytes;
u64 broadcast;
u64 multicast;
};
int setup_cn23xx_octeon_pf_device(struct octeon_device *oct); int setup_cn23xx_octeon_pf_device(struct octeon_device *oct);
int validate_cn23xx_pf_config_info(struct octeon_device *oct, int validate_cn23xx_pf_config_info(struct octeon_device *oct,
...@@ -56,4 +65,7 @@ int cn23xx_fw_loaded(struct octeon_device *oct); ...@@ -56,4 +65,7 @@ int cn23xx_fw_loaded(struct octeon_device *oct);
void cn23xx_tell_vf_its_macaddr_changed(struct octeon_device *oct, int vfidx, void cn23xx_tell_vf_its_macaddr_changed(struct octeon_device *oct, int vfidx,
u8 *mac); u8 *mac);
int cn23xx_get_vf_stats(struct octeon_device *oct, int ifidx,
struct oct_vf_stats *stats);
#endif #endif
...@@ -3326,6 +3326,31 @@ static const struct switchdev_ops lio_pf_switchdev_ops = { ...@@ -3326,6 +3326,31 @@ static const struct switchdev_ops lio_pf_switchdev_ops = {
.switchdev_port_attr_get = lio_pf_switchdev_attr_get, .switchdev_port_attr_get = lio_pf_switchdev_attr_get,
}; };
static int liquidio_get_vf_stats(struct net_device *netdev, int vfidx,
struct ifla_vf_stats *vf_stats)
{
struct lio *lio = GET_LIO(netdev);
struct octeon_device *oct = lio->oct_dev;
struct oct_vf_stats stats;
int ret;
if (vfidx < 0 || vfidx >= oct->sriov_info.num_vfs_alloced)
return -EINVAL;
memset(&stats, 0, sizeof(struct oct_vf_stats));
ret = cn23xx_get_vf_stats(oct, vfidx, &stats);
if (!ret) {
vf_stats->rx_packets = stats.rx_packets;
vf_stats->tx_packets = stats.tx_packets;
vf_stats->rx_bytes = stats.rx_bytes;
vf_stats->tx_bytes = stats.tx_bytes;
vf_stats->broadcast = stats.broadcast;
vf_stats->multicast = stats.multicast;
}
return ret;
}
static const struct net_device_ops lionetdevops = { static const struct net_device_ops lionetdevops = {
.ndo_open = liquidio_open, .ndo_open = liquidio_open,
.ndo_stop = liquidio_stop, .ndo_stop = liquidio_stop,
...@@ -3348,6 +3373,7 @@ static const struct net_device_ops lionetdevops = { ...@@ -3348,6 +3373,7 @@ static const struct net_device_ops lionetdevops = {
.ndo_get_vf_config = liquidio_get_vf_config, .ndo_get_vf_config = liquidio_get_vf_config,
.ndo_set_vf_trust = liquidio_set_vf_trust, .ndo_set_vf_trust = liquidio_set_vf_trust,
.ndo_set_vf_link_state = liquidio_set_vf_link_state, .ndo_set_vf_link_state = liquidio_set_vf_link_state,
.ndo_get_vf_stats = liquidio_get_vf_stats,
}; };
/** \brief Entry point for the liquidio module /** \brief Entry point for the liquidio module
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "octeon_device.h" #include "octeon_device.h"
#include "octeon_main.h" #include "octeon_main.h"
#include "octeon_mailbox.h" #include "octeon_mailbox.h"
#include "cn23xx_pf_device.h"
/** /**
* octeon_mbox_read: * octeon_mbox_read:
...@@ -205,6 +206,26 @@ int octeon_mbox_write(struct octeon_device *oct, ...@@ -205,6 +206,26 @@ int octeon_mbox_write(struct octeon_device *oct,
return ret; return ret;
} }
static void get_vf_stats(struct octeon_device *oct,
struct oct_vf_stats *stats)
{
int i;
for (i = 0; i < oct->num_iqs; i++) {
if (!oct->instr_queue[i])
continue;
stats->tx_packets += oct->instr_queue[i]->stats.tx_done;
stats->tx_bytes += oct->instr_queue[i]->stats.tx_tot_bytes;
}
for (i = 0; i < oct->num_oqs; i++) {
if (!oct->droq[i])
continue;
stats->rx_packets += oct->droq[i]->stats.rx_pkts_received;
stats->rx_bytes += oct->droq[i]->stats.rx_bytes_received;
}
}
/** /**
* octeon_mbox_process_cmd: * octeon_mbox_process_cmd:
* @mbox: Pointer mailbox * @mbox: Pointer mailbox
...@@ -250,6 +271,15 @@ static int octeon_mbox_process_cmd(struct octeon_mbox *mbox, ...@@ -250,6 +271,15 @@ static int octeon_mbox_process_cmd(struct octeon_mbox *mbox,
mbox_cmd->msg.s.params); mbox_cmd->msg.s.params);
break; break;
case OCTEON_GET_VF_STATS:
dev_dbg(&oct->pci_dev->dev, "Got VF stats request. Sending data back\n");
mbox_cmd->msg.s.type = OCTEON_MBOX_RESPONSE;
mbox_cmd->msg.s.resp_needed = 1;
mbox_cmd->msg.s.len = 1 +
sizeof(struct oct_vf_stats) / sizeof(u64);
get_vf_stats(oct, (struct oct_vf_stats *)mbox_cmd->data);
octeon_mbox_write(oct, mbox_cmd);
break;
default: default:
break; break;
} }
...@@ -322,3 +352,25 @@ int octeon_mbox_process_message(struct octeon_mbox *mbox) ...@@ -322,3 +352,25 @@ int octeon_mbox_process_message(struct octeon_mbox *mbox)
return 0; return 0;
} }
int octeon_mbox_cancel(struct octeon_device *oct, int q_no)
{
struct octeon_mbox *mbox = oct->mbox[q_no];
struct octeon_mbox_cmd *mbox_cmd;
unsigned long flags = 0;
spin_lock_irqsave(&mbox->lock, flags);
mbox_cmd = &mbox->mbox_resp;
if (!(mbox->state & OCTEON_MBOX_STATE_RESPONSE_PENDING)) {
spin_unlock_irqrestore(&mbox->lock, flags);
return 1;
}
mbox->state = OCTEON_MBOX_STATE_IDLE;
memset(mbox_cmd, 0, sizeof(*mbox_cmd));
writeq(OCTEON_PFVFSIG, mbox->mbox_read_reg);
spin_unlock_irqrestore(&mbox->lock, flags);
return 0;
}
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#define OCTEON_VF_ACTIVE 0x1 #define OCTEON_VF_ACTIVE 0x1
#define OCTEON_VF_FLR_REQUEST 0x2 #define OCTEON_VF_FLR_REQUEST 0x2
#define OCTEON_PF_CHANGED_VF_MACADDR 0x4 #define OCTEON_PF_CHANGED_VF_MACADDR 0x4
#define OCTEON_GET_VF_STATS 0x8
/*Macro for Read acknowldgement*/ /*Macro for Read acknowldgement*/
#define OCTEON_PFVFACK 0xffffffffffffffffULL #define OCTEON_PFVFACK 0xffffffffffffffffULL
...@@ -107,9 +108,15 @@ struct octeon_mbox { ...@@ -107,9 +108,15 @@ struct octeon_mbox {
}; };
struct oct_vf_stats_ctx {
atomic_t status;
struct oct_vf_stats *stats;
};
int octeon_mbox_read(struct octeon_mbox *mbox); int octeon_mbox_read(struct octeon_mbox *mbox);
int octeon_mbox_write(struct octeon_device *oct, int octeon_mbox_write(struct octeon_device *oct,
struct octeon_mbox_cmd *mbox_cmd); struct octeon_mbox_cmd *mbox_cmd);
int octeon_mbox_process_message(struct octeon_mbox *mbox); int octeon_mbox_process_message(struct octeon_mbox *mbox);
int octeon_mbox_cancel(struct octeon_device *oct, int q_no);
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
反馈
建议
客服 返回
顶部