Thread: [PATCH] firewire: core: utilize kref to maintain fw_node with reference counting
Brought to you by:
aeb,
bencollins
From: Takashi S. <o-t...@sa...> - 2024-08-01 02:26:40
|
Current implementation directly uses refcount_t to maintain the life time of fw_node, while kref is available for the same purpose. This commit replaces the implementation with kref. Signed-off-by: Takashi Sakamoto <o-t...@sa...> --- drivers/firewire/core-topology.c | 2 +- drivers/firewire/core.h | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/firewire/core-topology.c b/drivers/firewire/core-topology.c index b4e637aa6932..46e6eb287d24 100644 --- a/drivers/firewire/core-topology.c +++ b/drivers/firewire/core-topology.c @@ -39,7 +39,7 @@ static struct fw_node *fw_node_create(u32 sid, int port_count, int color) node->initiated_reset = phy_packet_self_id_zero_get_initiated_reset(sid); node->port_count = port_count; - refcount_set(&node->ref_count, 1); + kref_init(&node->kref); INIT_LIST_HEAD(&node->link); return node; diff --git a/drivers/firewire/core.h b/drivers/firewire/core.h index 7c36d2628e37..189e15e6ba82 100644 --- a/drivers/firewire/core.h +++ b/drivers/firewire/core.h @@ -183,7 +183,8 @@ struct fw_node { * local node to this node. */ u8 max_depth:4; /* Maximum depth to any leaf node */ u8 max_hops:4; /* Max hops in this sub tree */ - refcount_t ref_count; + + struct kref kref; /* For serializing node topology into a list. */ struct list_head link; @@ -196,15 +197,21 @@ struct fw_node { static inline struct fw_node *fw_node_get(struct fw_node *node) { - refcount_inc(&node->ref_count); + kref_get(&node->kref); return node; } +static void release_node(struct kref *kref) +{ + struct fw_node *node = container_of(kref, struct fw_node, kref); + + kfree(node); +} + static inline void fw_node_put(struct fw_node *node) { - if (refcount_dec_and_test(&node->ref_count)) - kfree(node); + kref_put(&node->kref, release_node); } void fw_core_handle_bus_reset(struct fw_card *card, int node_id, -- 2.43.0 |
From: Takashi S. <o-t...@sa...> - 2024-08-01 23:29:53
|
On Thu, Aug 01, 2024 at 11:26:29AM +0900, Takashi Sakamoto wrote: > Current implementation directly uses refcount_t to maintain the life time > of fw_node, while kref is available for the same purpose. > > This commit replaces the implementation with kref. > > Signed-off-by: Takashi Sakamoto <o-t...@sa...> > --- > drivers/firewire/core-topology.c | 2 +- > drivers/firewire/core.h | 15 +++++++++++---- > 2 files changed, 12 insertions(+), 5 deletions(-) > > diff --git a/drivers/firewire/core-topology.c b/drivers/firewire/core-topology.c > index b4e637aa6932..46e6eb287d24 100644 > --- a/drivers/firewire/core-topology.c > +++ b/drivers/firewire/core-topology.c > @@ -39,7 +39,7 @@ static struct fw_node *fw_node_create(u32 sid, int port_count, int color) > node->initiated_reset = phy_packet_self_id_zero_get_initiated_reset(sid); > node->port_count = port_count; > > - refcount_set(&node->ref_count, 1); > + kref_init(&node->kref); > INIT_LIST_HEAD(&node->link); > > return node; > diff --git a/drivers/firewire/core.h b/drivers/firewire/core.h > index 7c36d2628e37..189e15e6ba82 100644 > --- a/drivers/firewire/core.h > +++ b/drivers/firewire/core.h > @@ -183,7 +183,8 @@ struct fw_node { > * local node to this node. */ > u8 max_depth:4; /* Maximum depth to any leaf node */ > u8 max_hops:4; /* Max hops in this sub tree */ > - refcount_t ref_count; > + > + struct kref kref; > > /* For serializing node topology into a list. */ > struct list_head link; > @@ -196,15 +197,21 @@ struct fw_node { > > static inline struct fw_node *fw_node_get(struct fw_node *node) > { > - refcount_inc(&node->ref_count); > + kref_get(&node->kref); > > return node; > } > > +static void release_node(struct kref *kref) > +{ > + struct fw_node *node = container_of(kref, struct fw_node, kref); > + > + kfree(node); > +} > + > static inline void fw_node_put(struct fw_node *node) > { > - if (refcount_dec_and_test(&node->ref_count)) > - kfree(node); > + kref_put(&node->kref, release_node); > } > > void fw_core_handle_bus_reset(struct fw_card *card, int node_id, Applied to for-next branch. Regards Takashi Sakamoto |