Message ID | 1655068494-16440-4-git-send-email-longli@linuxonhyperv.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Introduce Microsoft Azure Network Adapter (MANA) RDMA driver | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Guessed tree name to be net-next |
netdev/fixes_present | success | Fixes tag not required for -next series |
netdev/subject_prefix | success | Link |
netdev/cover_letter | success | Series has a cover letter |
netdev/patch_count | success | Link |
netdev/header_inline | success | No static functions without inline keyword in header files |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/cc_maintainers | success | CCed 11 of 11 maintainers |
netdev/build_clang | success | Errors and warnings before: 0 this patch: 0 |
netdev/module_param | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Signed-off-by tag matches author and committer |
netdev/check_selftest | success | No net selftest shell script |
netdev/verify_fixes | success | No Fixes tag |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 79 lines checked |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/source_inline | success | Was 0 now: 0 |
From: longli@linuxonhyperv.com Date: Sun, 12 Jun 2022 14:14:45 -0700 > +int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id, > + u32 doorbell_pg_id) > { > + /* Ethernet driver and IB driver can't take the port at the same time */ > + refcount_inc(&apc->port_use_count); > + if (refcount_read(&apc->port_use_count) > 2) { This is a racy test, the count could change after the test against '2'. It would be nice if there was a primitive to do the increment and test atomically, but I fail to see one that matches this scenerio currently. Thank you.
> Subject: Re: [Patch v3 03/12] net: mana: Handle vport sharing between > devices > > From: longli@linuxonhyperv.com > Date: Sun, 12 Jun 2022 14:14:45 -0700 > > > +int mana_cfg_vport(struct mana_port_context *apc, u32 > protection_dom_id, > > + u32 doorbell_pg_id) > > { > > + /* Ethernet driver and IB driver can't take the port at the same time > */ > > + refcount_inc(&apc->port_use_count); > > + if (refcount_read(&apc->port_use_count) > 2) { > > This is a racy test, the count could change after the test against '2'. It would > be nice if there was a primitive to do the increment and test atomically, but I > fail to see one that matches this scenerio currently. > > Thank you. I'm changing it to mutex. Thank you, Long
diff --git a/drivers/net/ethernet/microsoft/mana/mana.h b/drivers/net/ethernet/microsoft/mana/mana.h index 51bff91b63ee..6aacbf42aeaf 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; + refcount_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 745a9783dd70..839f7099ac2d 100644 --- a/drivers/net/ethernet/microsoft/mana/mana_en.c +++ b/drivers/net/ethernet/microsoft/mana/mana_en.c @@ -530,13 +530,26 @@ 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) +{ + refcount_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 */ + refcount_inc(&apc->port_use_count); + if (refcount_read(&apc->port_use_count) > 2) { + refcount_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; @@ -563,9 +576,13 @@ static int mana_cfg_vport(struct mana_port_context *apc, u32 protection_dom_id, apc->tx_shortform_allowed = resp.short_form_allowed; apc->tx_vp_offset = resp.tx_vport_offset; + + netdev_info(apc->ndev, "Configured vPort %llu PD %u DB %u\n", + apc->port_handle, protection_dom_id, doorbell_pg_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, @@ -626,6 +643,9 @@ static int mana_cfg_vport_steering(struct mana_port_context *apc, resp.hdr.status); err = -EPROTO; } + + netdev_info(ndev, "Configured steering vPort %llu entries %u\n", + apc->port_handle, num_entries); out: kfree(req); return err; @@ -1678,6 +1698,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, @@ -1928,6 +1950,7 @@ static int mana_probe_port(struct mana_context *ac, int port_idx, apc->num_queues = gc->max_num_queues; apc->port_handle = INVALID_MANA_HANDLE; apc->port_idx = port_idx; + refcount_set(&apc->port_use_count, 1); ndev->netdev_ops = &mana_devops; ndev->ethtool_ops = &mana_ethtool_ops;