Skip to content

Commit f60f357

Browse files
committed
Merge: CNB96: xfrm: get global statistics from the offloaded device
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/5267 JIRA: https://issues.redhat.com/browse/RHEL-59900 ``` xfrm: generalize xdo_dev_state_update_curlft to allow statistics update In order to allow drivers to fill all statistics, change the name of xdo_dev_state_update_curlft to be xdo_dev_state_update_stats. Acked-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: Leon Romanovsky <leonro@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> (cherry picked from commit fd2bc41) ``` ``` xfrm: get global statistics from the offloaded device Iterate over all SAs in order to fill global IPsec statistics. Acked-by: Steffen Klassert <steffen.klassert@secunet.com> Signed-off-by: Leon Romanovsky <leonro@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> (cherry picked from commit f9f221c) ``` Signed-off-by: CKI Backport Bot <cki-ci-bot+cki-gitlab-backport-bot@redhat.com> --- <small>Created 2024-09-24 11:17 UTC by backporter - [KWF FAQ](https://red.ht/kernel_workflow_doc) - [Slack #team-kernel-workflow](https://redhat-internal.slack.com/archives/C04LRUPMJQ5) - [Source](https://gitlab.com/cki-project/kernel-workflow/-/blob/main/webhook/utils/backporter.py) - [Documentation](https://gitlab.com/cki-project/kernel-workflow/-/blob/main/docs/README.backporter.md) - [Report an issue](https://gitlab.com/cki-project/kernel-workflow/-/issues/new?issue%5Btitle%5D=backporter%20webhook%20issue)</small> Approved-by: José Ignacio Tornos Martínez <jtornosm@redhat.com> Approved-by: Hangbin Liu <haliu@redhat.com> Approved-by: Ivan Vecera <ivecera@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Rado Vrbovsky <rvrbovsk@redhat.com>
2 parents 4d10fdd + b1d83a0 commit f60f357

File tree

7 files changed

+33
-17
lines changed

7 files changed

+33
-17
lines changed

Documentation/networking/xfrm_device.rst

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,9 @@ Callbacks to implement
7171
bool (*xdo_dev_offload_ok) (struct sk_buff *skb,
7272
struct xfrm_state *x);
7373
void (*xdo_dev_state_advance_esn) (struct xfrm_state *x);
74+
void (*xdo_dev_state_update_stats) (struct xfrm_state *x);
7475

7576
/* Solely packet offload callbacks */
76-
void (*xdo_dev_state_update_curlft) (struct xfrm_state *x);
7777
int (*xdo_dev_policy_add) (struct xfrm_policy *x, struct netlink_ext_ack *extack);
7878
void (*xdo_dev_policy_delete) (struct xfrm_policy *x);
7979
void (*xdo_dev_policy_free) (struct xfrm_policy *x);
@@ -191,6 +191,6 @@ xdo_dev_policy_free() on any remaining offloaded states.
191191

192192
Outcome of HW handling packets, the XFRM core can't count hard, soft limits.
193193
The HW/driver are responsible to perform it and provide accurate data when
194-
xdo_dev_state_update_curlft() is called. In case of one of these limits
194+
xdo_dev_state_update_stats() is called. In case of one of these limits
195195
occuried, the driver needs to call to xfrm_state_check_expire() to make sure
196196
that XFRM performs rekeying sequence.

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -984,16 +984,18 @@ static void mlx5e_xfrm_advance_esn_state(struct xfrm_state *x)
984984
queue_work(sa_entry->ipsec->wq, &work->work);
985985
}
986986

987-
static void mlx5e_xfrm_update_curlft(struct xfrm_state *x)
987+
static void mlx5e_xfrm_update_stats(struct xfrm_state *x)
988988
{
989989
struct mlx5e_ipsec_sa_entry *sa_entry = to_ipsec_sa_entry(x);
990990
struct mlx5e_ipsec_rule *ipsec_rule = &sa_entry->ipsec_rule;
991991
u64 packets, bytes, lastuse;
992992

993993
lockdep_assert(lockdep_is_held(&x->lock) ||
994-
lockdep_is_held(&dev_net(x->xso.real_dev)->xfrm.xfrm_cfg_mutex));
994+
lockdep_is_held(&dev_net(x->xso.real_dev)->xfrm.xfrm_cfg_mutex) ||
995+
lockdep_is_held(&dev_net(x->xso.real_dev)->xfrm.xfrm_state_lock));
995996

996-
if (x->xso.flags & XFRM_DEV_OFFLOAD_FLAG_ACQ)
997+
if (x->xso.flags & XFRM_DEV_OFFLOAD_FLAG_ACQ ||
998+
x->xso.type != XFRM_DEV_OFFLOAD_PACKET)
997999
return;
9981000

9991001
mlx5_fc_query_cached(ipsec_rule->fc, &bytes, &packets, &lastuse);
@@ -1156,7 +1158,7 @@ static const struct xfrmdev_ops mlx5e_ipsec_xfrmdev_ops = {
11561158
.xdo_dev_offload_ok = mlx5e_ipsec_offload_ok,
11571159
.xdo_dev_state_advance_esn = mlx5e_xfrm_advance_esn_state,
11581160

1159-
.xdo_dev_state_update_curlft = mlx5e_xfrm_update_curlft,
1161+
.xdo_dev_state_update_stats = mlx5e_xfrm_update_stats,
11601162
.xdo_dev_policy_add = mlx5e_xfrm_add_policy,
11611163
.xdo_dev_policy_delete = mlx5e_xfrm_del_policy,
11621164
.xdo_dev_policy_free = mlx5e_xfrm_free_policy,

include/linux/netdevice.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -972,7 +972,7 @@ struct xfrmdev_ops {
972972
bool (*xdo_dev_offload_ok) (struct sk_buff *skb,
973973
struct xfrm_state *x);
974974
void (*xdo_dev_state_advance_esn) (struct xfrm_state *x);
975-
void (*xdo_dev_state_update_curlft) (struct xfrm_state *x);
975+
void (*xdo_dev_state_update_stats) (struct xfrm_state *x);
976976
int (*xdo_dev_policy_add) (struct xfrm_policy *x, struct netlink_ext_ack *extack);
977977
void (*xdo_dev_policy_delete) (struct xfrm_policy *x);
978978
void (*xdo_dev_policy_free) (struct xfrm_policy *x);

include/net/xfrm.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@
5353

5454
#ifdef CONFIG_XFRM_STATISTICS
5555
#define XFRM_INC_STATS(net, field) SNMP_INC_STATS((net)->mib.xfrm_statistics, field)
56+
#define XFRM_ADD_STATS(net, field, val) SNMP_ADD_STATS((net)->mib.xfrm_statistics, field, val)
5657
#else
5758
#define XFRM_INC_STATS(net, field) ((void)(net))
59+
#define XFRM_ADD_STATS(net, field, val) ((void)(net))
5860
#endif
5961

6062

@@ -1571,22 +1573,20 @@ struct xfrm_state *xfrm_stateonly_find(struct net *net, u32 mark, u32 if_id,
15711573
struct xfrm_state *xfrm_state_lookup_byspi(struct net *net, __be32 spi,
15721574
unsigned short family);
15731575
int xfrm_state_check_expire(struct xfrm_state *x);
1576+
void xfrm_state_update_stats(struct net *net);
15741577
#ifdef CONFIG_XFRM_OFFLOAD
1575-
static inline void xfrm_dev_state_update_curlft(struct xfrm_state *x)
1578+
static inline void xfrm_dev_state_update_stats(struct xfrm_state *x)
15761579
{
15771580
struct xfrm_dev_offload *xdo = &x->xso;
15781581
struct net_device *dev = xdo->dev;
15791582

1580-
if (x->xso.type != XFRM_DEV_OFFLOAD_PACKET)
1581-
return;
1582-
15831583
if (dev && dev->xfrmdev_ops &&
1584-
dev->xfrmdev_ops->xdo_dev_state_update_curlft)
1585-
dev->xfrmdev_ops->xdo_dev_state_update_curlft(x);
1584+
dev->xfrmdev_ops->xdo_dev_state_update_stats)
1585+
dev->xfrmdev_ops->xdo_dev_state_update_stats(x);
15861586

15871587
}
15881588
#else
1589-
static inline void xfrm_dev_state_update_curlft(struct xfrm_state *x) {}
1589+
static inline void xfrm_dev_state_update_stats(struct xfrm_state *x) {}
15901590
#endif
15911591
void xfrm_state_insert(struct xfrm_state *x);
15921592
int xfrm_state_add(struct xfrm_state *x);

net/xfrm/xfrm_proc.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ static int xfrm_statistics_seq_show(struct seq_file *seq, void *v)
5252

5353
memset(buff, 0, sizeof(unsigned long) * LINUX_MIB_XFRMMAX);
5454

55+
xfrm_state_update_stats(net);
5556
snmp_get_cpu_field_batch(buff, xfrm_mib_list,
5657
net->mib.xfrm_statistics);
5758
for (i = 0; xfrm_mib_list[i].name; i++)

net/xfrm/xfrm_state.c

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ static enum hrtimer_restart xfrm_timer_handler(struct hrtimer *me)
570570
int err = 0;
571571

572572
spin_lock(&x->lock);
573-
xfrm_dev_state_update_curlft(x);
573+
xfrm_dev_state_update_stats(x);
574574

575575
if (x->km.state == XFRM_STATE_DEAD)
576576
goto out;
@@ -1934,7 +1934,7 @@ EXPORT_SYMBOL(xfrm_state_update);
19341934

19351935
int xfrm_state_check_expire(struct xfrm_state *x)
19361936
{
1937-
xfrm_dev_state_update_curlft(x);
1937+
xfrm_dev_state_update_stats(x);
19381938

19391939
if (!READ_ONCE(x->curlft.use_time))
19401940
WRITE_ONCE(x->curlft.use_time, ktime_get_real_seconds());
@@ -1956,6 +1956,19 @@ int xfrm_state_check_expire(struct xfrm_state *x)
19561956
}
19571957
EXPORT_SYMBOL(xfrm_state_check_expire);
19581958

1959+
void xfrm_state_update_stats(struct net *net)
1960+
{
1961+
struct xfrm_state *x;
1962+
int i;
1963+
1964+
spin_lock_bh(&net->xfrm.xfrm_state_lock);
1965+
for (i = 0; i <= net->xfrm.state_hmask; i++) {
1966+
hlist_for_each_entry(x, net->xfrm.state_bydst + i, bydst)
1967+
xfrm_dev_state_update_stats(x);
1968+
}
1969+
spin_unlock_bh(&net->xfrm.xfrm_state_lock);
1970+
}
1971+
19591972
struct xfrm_state *
19601973
xfrm_state_lookup(struct net *net, u32 mark, const xfrm_address_t *daddr, __be32 spi,
19611974
u8 proto, unsigned short family)

net/xfrm/xfrm_user.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -902,7 +902,7 @@ static void copy_to_user_state(struct xfrm_state *x, struct xfrm_usersa_info *p)
902902
memcpy(&p->sel, &x->sel, sizeof(p->sel));
903903
memcpy(&p->lft, &x->lft, sizeof(p->lft));
904904
if (x->xso.dev)
905-
xfrm_dev_state_update_curlft(x);
905+
xfrm_dev_state_update_stats(x);
906906
memcpy(&p->curlft, &x->curlft, sizeof(p->curlft));
907907
put_unaligned(x->stats.replay_window, &p->stats.replay_window);
908908
put_unaligned(x->stats.replay, &p->stats.replay);

0 commit comments

Comments
 (0)