Message ID | 1652778276-2986-4-git-send-email-longli@linuxonhyperv.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Jason Gunthorpe |
Headers | show |
Series | Introduce Microsoft Azure Network Adapter (MANA) RDMA driver | expand |
On Tue, 17 May 2022 02:04:27 -0700 longli@linuxonhyperv.com wrote: > diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h > index 51bff91b63ee..26f14fcb6a61 100644 > --- a/drivers/net/ethernet/microsoft/mana/mana.h > +++ b/drivers/net/ethernet/microsoft/mana/mana.h > @@ -375,6 +375,7 @@ struct mana_port_context { > unsigned int num_queues; > > mana_handle_t port_handle; > + atomic_t port_use_count; Could this be a refcount_t instead? The refcount_t has protections against under/overflow.
> Subject: Re: [PATCH 03/12] net: mana: Handle vport sharing between devices > > On Tue, 17 May 2022 02:04:27 -0700 > longli@linuxonhyperv.com wrote: > > > diff --git a/drivers/net/ethernet/microsoft/mana/mana.h > b/drivers/net/ethernet/microsoft/mana/mana.h > > index 51bff91b63ee..26f14fcb6a61 100644 > > --- a/drivers/net/ethernet/microsoft/mana/mana.h > > +++ b/drivers/net/ethernet/microsoft/mana/mana.h > > @@ -375,6 +375,7 @@ struct mana_port_context { > > unsigned int num_queues; > > > > mana_handle_t port_handle; > > + atomic_t port_use_count; > > Could this be a refcount_t instead? > The refcount_t has protections against under/overflow. Thanks for pointing this out. I will use refcount_t for v2. Long
diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h index 51bff91b63ee..26f14fcb6a61 100644 --- a/drivers/net/ethernet/microsoft/mana/mana.h +++ b/drivers/net/ethernet/microsoft/mana/mana.h @@ -375,6 +375,7 @@ struct mana_port_context { unsigned int num_queues; mana_handle_t port_handle; + atomic_t port_use_count; u16 port_idx; @@ -567,4 +568,7 @@ struct mana_adev { struct gdma_dev *mdev; }; +int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id, + u32 doorbell_pg_id); +void mana_uncfg_vport(struct mana_port_context *apc); #endif /* _MANA_H */ diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c b/drivers/net/ethernet/microsoft/mana/mana_en.c index c706bf943e49..4f7a50ace9f6 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -530,13 +530,25 @@ static int mana_query_vport_cfg(struct mana_port_context *apc, u32 vport_index, return 0; } -static int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id, - u32 doorbell_pg_id) +void mana_uncfg_vport(struct mana_port_context *apc) +{ + atomic_dec(&apc->port_use_count); +} +EXPORT_SYMBOL_GPL(mana_uncfg_vport); + +int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id, + u32 doorbell_pg_id) { struct mana_config_vport_resp resp = {}; struct mana_config_vport_req req = {}; int err; + /* Ethernet driver and IB driver can't take the port at the same time */ + if (atomic_inc_return(&apc->port_use_count) != 1) { + atomic_dec(&apc->port_use_count); + return -ENODEV; + } + mana_gd_init_req_hdr(&req.hdr, MANA_CONFIG_VPORT_TX, sizeof(req), sizeof(resp)); req.vport = apc->port_handle; @@ -566,6 +578,7 @@ static int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id, out: return err; } +EXPORT_SYMBOL_GPL(mana_cfg_vport); static int mana_cfg_vport_steering(struct mana_port_context *apc, enum TRI_STATE rx, @@ -1678,6 +1691,8 @@ static void mana_destroy_vport(struct mana_port_context *apc) } mana_destroy_txq(apc); + + mana_uncfg_vport(apc); } static int mana_create_vport(struct mana_port_context *apc,