mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
thunderbolt: tunnel: Simplify allocation
Use a flexible array member and kzalloc_flex to combine allocations. Add __counted_by for extra runtime analysis. Move counting variable assignment after allocation. kzalloc_flex with GCC >= 15 does this automatically. Signed-off-by: Rosen Penev <rosenp@gmail.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
This commit is contained in:
parent
c3e7cc8bc5
commit
498c05821b
|
|
@ -180,19 +180,14 @@ static struct tb_tunnel *tb_tunnel_alloc(struct tb *tb, size_t npaths,
|
|||
{
|
||||
struct tb_tunnel *tunnel;
|
||||
|
||||
tunnel = kzalloc_obj(*tunnel);
|
||||
tunnel = kzalloc_flex(*tunnel, paths, npaths);
|
||||
if (!tunnel)
|
||||
return NULL;
|
||||
|
||||
tunnel->paths = kzalloc_objs(tunnel->paths[0], npaths);
|
||||
if (!tunnel->paths) {
|
||||
kfree(tunnel);
|
||||
return NULL;
|
||||
}
|
||||
tunnel->npaths = npaths;
|
||||
|
||||
INIT_LIST_HEAD(&tunnel->list);
|
||||
tunnel->tb = tb;
|
||||
tunnel->npaths = npaths;
|
||||
tunnel->type = type;
|
||||
kref_init(&tunnel->kref);
|
||||
|
||||
|
|
@ -219,7 +214,6 @@ static void tb_tunnel_destroy(struct kref *kref)
|
|||
tb_path_free(tunnel->paths[i]);
|
||||
}
|
||||
|
||||
kfree(tunnel->paths);
|
||||
kfree(tunnel);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,6 @@ enum tb_tunnel_state {
|
|||
* @src_port: Source port of the tunnel
|
||||
* @dst_port: Destination port of the tunnel. For discovered incomplete
|
||||
* tunnels may be %NULL or null adapter port instead.
|
||||
* @paths: All paths required by the tunnel
|
||||
* @npaths: Number of paths in @paths
|
||||
* @pre_activate: Optional tunnel specific initialization called before
|
||||
* activation. Can touch hardware.
|
||||
|
|
@ -69,13 +68,13 @@ enum tb_tunnel_state {
|
|||
* @dprx_work: Worker that is scheduled to poll completion of DPRX capabilities read
|
||||
* @callback: Optional callback called when DP tunnel is fully activated
|
||||
* @callback_data: Optional data for @callback
|
||||
* @paths: All paths required by the tunnel
|
||||
*/
|
||||
struct tb_tunnel {
|
||||
struct kref kref;
|
||||
struct tb *tb;
|
||||
struct tb_port *src_port;
|
||||
struct tb_port *dst_port;
|
||||
struct tb_path **paths;
|
||||
size_t npaths;
|
||||
int (*pre_activate)(struct tb_tunnel *tunnel);
|
||||
int (*activate)(struct tb_tunnel *tunnel, bool activate);
|
||||
|
|
@ -107,6 +106,8 @@ struct tb_tunnel {
|
|||
struct delayed_work dprx_work;
|
||||
void (*callback)(struct tb_tunnel *tunnel, void *data);
|
||||
void *callback_data;
|
||||
|
||||
struct tb_path *paths[] __counted_by(npaths);
|
||||
};
|
||||
|
||||
struct tb_tunnel *tb_tunnel_discover_pci(struct tb *tb, struct tb_port *down,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user