mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 01:55:51 +02:00
RDMA/rtrs: Use flexible array for client path stats
Store the client path statistics in the RTRS client path allocation instead of allocating them separately. This ties the stats lifetime directly to the path and removes a separate allocation failure path. Keep freeing the per-CPU stats data separately, but do not free the embedded stats object from error paths or the stats kobject release handler. Link: https://patch.msgid.link/r/20260511041812.378030-1-rosenp@gmail.com Assisted-by: Codex:GPT-5.5 Signed-off-by: Rosen Penev <rosenp@gmail.com> Acked-by: Jack Wang <jinpu.wang@ionos.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
47b730054f
commit
992ad0c012
|
|
@ -37,8 +37,6 @@ static void rtrs_clt_path_stats_release(struct kobject *kobj)
|
|||
stats = container_of(kobj, struct rtrs_clt_stats, kobj_stats);
|
||||
|
||||
free_percpu(stats->pcpu_stats);
|
||||
|
||||
kfree(stats);
|
||||
}
|
||||
|
||||
static struct kobj_type ktype_stats = {
|
||||
|
|
|
|||
|
|
@ -1536,7 +1536,7 @@ static struct rtrs_clt_path *alloc_path(struct rtrs_clt_sess *clt,
|
|||
int cpu;
|
||||
size_t total_con;
|
||||
|
||||
clt_path = kzalloc_obj(*clt_path);
|
||||
clt_path = kzalloc_flex(*clt_path, stats, 1);
|
||||
if (!clt_path)
|
||||
goto err;
|
||||
|
||||
|
|
@ -1552,10 +1552,6 @@ static struct rtrs_clt_path *alloc_path(struct rtrs_clt_sess *clt,
|
|||
clt_path->s.con_num = total_con;
|
||||
clt_path->s.irq_con_num = con_num + 1;
|
||||
|
||||
clt_path->stats = kzalloc_obj(*clt_path->stats);
|
||||
if (!clt_path->stats)
|
||||
goto err_free_con;
|
||||
|
||||
mutex_init(&clt_path->init_mutex);
|
||||
uuid_gen(&clt_path->s.uuid);
|
||||
memcpy(&clt_path->s.dst_addr, path->dst,
|
||||
|
|
@ -1583,7 +1579,7 @@ static struct rtrs_clt_path *alloc_path(struct rtrs_clt_sess *clt,
|
|||
|
||||
clt_path->mp_skip_entry = alloc_percpu(typeof(*clt_path->mp_skip_entry));
|
||||
if (!clt_path->mp_skip_entry)
|
||||
goto err_free_stats;
|
||||
goto err_free_con;
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
INIT_LIST_HEAD(per_cpu_ptr(clt_path->mp_skip_entry, cpu));
|
||||
|
|
@ -1596,8 +1592,6 @@ static struct rtrs_clt_path *alloc_path(struct rtrs_clt_sess *clt,
|
|||
|
||||
err_free_percpu:
|
||||
free_percpu(clt_path->mp_skip_entry);
|
||||
err_free_stats:
|
||||
kfree(clt_path->stats);
|
||||
err_free_con:
|
||||
kfree(clt_path->s.con);
|
||||
err_free_path:
|
||||
|
|
@ -2863,7 +2857,6 @@ struct rtrs_clt_sess *rtrs_clt_open(struct rtrs_clt_ops *ops,
|
|||
list_del_rcu(&clt_path->s.entry);
|
||||
rtrs_clt_close_conns(clt_path, true);
|
||||
free_percpu(clt_path->stats->pcpu_stats);
|
||||
kfree(clt_path->stats);
|
||||
free_path(clt_path);
|
||||
goto close_all_path;
|
||||
}
|
||||
|
|
@ -2873,7 +2866,6 @@ struct rtrs_clt_sess *rtrs_clt_open(struct rtrs_clt_ops *ops,
|
|||
list_del_rcu(&clt_path->s.entry);
|
||||
rtrs_clt_close_conns(clt_path, true);
|
||||
free_percpu(clt_path->stats->pcpu_stats);
|
||||
kfree(clt_path->stats);
|
||||
free_path(clt_path);
|
||||
goto close_all_path;
|
||||
}
|
||||
|
|
@ -3166,7 +3158,6 @@ int rtrs_clt_create_path_from_sysfs(struct rtrs_clt_sess *clt,
|
|||
rtrs_clt_remove_path_from_arr(clt_path);
|
||||
rtrs_clt_close_conns(clt_path, true);
|
||||
free_percpu(clt_path->stats->pcpu_stats);
|
||||
kfree(clt_path->stats);
|
||||
free_path(clt_path);
|
||||
|
||||
return err;
|
||||
|
|
|
|||
|
|
@ -142,12 +142,12 @@ struct rtrs_clt_path {
|
|||
u32 flags;
|
||||
struct kobject kobj;
|
||||
u8 for_new_clt;
|
||||
struct rtrs_clt_stats *stats;
|
||||
/* cache hca_port and hca_name to display in sysfs */
|
||||
u8 hca_port;
|
||||
char hca_name[IB_DEVICE_NAME_MAX];
|
||||
struct list_head __percpu
|
||||
*mp_skip_entry;
|
||||
struct rtrs_clt_stats stats[];
|
||||
};
|
||||
|
||||
struct rtrs_clt_sess {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user