sfxge: make lock names unique
Lock name should include interface name. Tx queue and event queue lock name should include queue number. Sponsored by: Solarflare Communications, Inc. Approved by: gnn (mentor)
This commit is contained in:
parent
ed1ffc3b4b
commit
33d45dc5e4
@ -509,16 +509,26 @@ typedef struct efsys_mem_s {
|
||||
|
||||
/* BAR */
|
||||
|
||||
#define SFXGE_LOCK_NAME_MAX 16
|
||||
|
||||
typedef struct efsys_bar_s {
|
||||
struct mtx esb_lock;
|
||||
char esb_lock_name[SFXGE_LOCK_NAME_MAX];
|
||||
bus_space_tag_t esb_tag;
|
||||
bus_space_handle_t esb_handle;
|
||||
int esb_rid;
|
||||
struct resource *esb_res;
|
||||
} efsys_bar_t;
|
||||
|
||||
#define SFXGE_BAR_LOCK_INIT(_esbp, _name) \
|
||||
mtx_init(&(_esbp)->esb_lock, (_name), NULL, MTX_DEF)
|
||||
#define SFXGE_BAR_LOCK_INIT(_esbp, _ifname) \
|
||||
do { \
|
||||
snprintf((_esbp)->esb_lock_name, \
|
||||
sizeof((_esbp)->esb_lock_name), \
|
||||
"%s:bar", (_ifname)); \
|
||||
mtx_init(&(_esbp)->esb_lock, (_esbp)->esb_lock_name, \
|
||||
NULL, MTX_DEF); \
|
||||
_NOTE(CONSTANTCONDITION) \
|
||||
} while (B_FALSE)
|
||||
#define SFXGE_BAR_LOCK_DESTROY(_esbp) \
|
||||
mtx_destroy(&(_esbp)->esb_lock)
|
||||
#define SFXGE_BAR_LOCK(_esbp) \
|
||||
@ -721,13 +731,35 @@ typedef clock_t efsys_timestamp_t;
|
||||
|
||||
/* LOCK */
|
||||
|
||||
typedef struct mtx efsys_lock_t;
|
||||
typedef struct efsys_lock_s {
|
||||
struct mtx lock;
|
||||
char lock_name[SFXGE_LOCK_NAME_MAX];
|
||||
} efsys_lock_t;
|
||||
|
||||
#define SFXGE_EFSYS_LOCK_INIT(_eslp, _ifname, _label) \
|
||||
do { \
|
||||
efsys_lock_t *__eslp = (_eslp); \
|
||||
\
|
||||
snprintf((__eslp)->lock_name, \
|
||||
sizeof((__eslp)->lock_name), \
|
||||
"%s:%s", (_ifname), (_label)); \
|
||||
mtx_init(&(__eslp)->lock, (__eslp)->lock_name, \
|
||||
NULL, MTX_DEF); \
|
||||
} while (B_FALSE)
|
||||
#define SFXGE_EFSYS_LOCK_DESTROY(_eslp) \
|
||||
mtx_destroy(&(_eslp)->lock)
|
||||
#define SFXGE_EFSYS_LOCK(_eslp) \
|
||||
mtx_lock(&(_eslp)->lock)
|
||||
#define SFXGE_EFSYS_UNLOCK(_eslp) \
|
||||
mtx_unlock(&(_eslp)->lock)
|
||||
#define SFXGE_EFSYS_LOCK_ASSERT_OWNED(_eslp) \
|
||||
mtx_assert(&(_eslp)->lock, MA_OWNED)
|
||||
|
||||
#define EFSYS_LOCK_MAGIC 0x000010c4
|
||||
|
||||
#define EFSYS_LOCK(_lockp, _state) \
|
||||
do { \
|
||||
mtx_lock(_lockp); \
|
||||
SFXGE_EFSYS_LOCK(_lockp); \
|
||||
(_state) = EFSYS_LOCK_MAGIC; \
|
||||
_NOTE(CONSTANTCONDITION) \
|
||||
} while (B_FALSE)
|
||||
@ -736,7 +768,7 @@ typedef struct mtx efsys_lock_t;
|
||||
do { \
|
||||
if ((_state) != EFSYS_LOCK_MAGIC) \
|
||||
KASSERT(B_FALSE, ("not locked")); \
|
||||
mtx_unlock(_lockp); \
|
||||
SFXGE_EFSYS_UNLOCK(_lockp); \
|
||||
_NOTE(CONSTANTCONDITION) \
|
||||
} while (B_FALSE)
|
||||
|
||||
|
@ -338,7 +338,9 @@ sfxge_ifnet_init(struct ifnet *ifp, struct sfxge_softc *sc)
|
||||
ifp->if_snd.ifq_drv_maxlen = sc->txq_entries - 1;
|
||||
IFQ_SET_READY(&ifp->if_snd);
|
||||
|
||||
mtx_init(&sc->tx_lock, "txq", NULL, MTX_DEF);
|
||||
snprintf(sc->tx_lock_name, sizeof(sc->tx_lock_name),
|
||||
"%s:tx", device_get_nameunit(sc->dev));
|
||||
mtx_init(&sc->tx_lock, sc->tx_lock_name, NULL, MTX_DEF);
|
||||
#endif
|
||||
|
||||
if ((rc = sfxge_port_ifmedia_init(sc)) != 0)
|
||||
@ -376,7 +378,8 @@ sfxge_bar_init(struct sfxge_softc *sc)
|
||||
}
|
||||
esbp->esb_tag = rman_get_bustag(esbp->esb_res);
|
||||
esbp->esb_handle = rman_get_bushandle(esbp->esb_res);
|
||||
SFXGE_BAR_LOCK_INIT(esbp, "sfxge_efsys_bar");
|
||||
|
||||
SFXGE_BAR_LOCK_INIT(esbp, device_get_nameunit(sc->dev));
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -401,7 +404,7 @@ sfxge_create(struct sfxge_softc *sc)
|
||||
|
||||
dev = sc->dev;
|
||||
|
||||
SFXGE_ADAPTER_LOCK_INIT(sc, "sfxge_softc");
|
||||
SFXGE_ADAPTER_LOCK_INIT(sc, device_get_nameunit(sc->dev));
|
||||
|
||||
sc->max_rss_channels = 0;
|
||||
snprintf(rss_param_name, sizeof(rss_param_name),
|
||||
@ -435,7 +438,8 @@ sfxge_create(struct sfxge_softc *sc)
|
||||
KASSERT(error == 0, ("Family should be filtered by sfxge_probe()"));
|
||||
|
||||
/* Create the common code nic object. */
|
||||
mtx_init(&sc->enp_lock, "sfxge_nic", NULL, MTX_DEF);
|
||||
SFXGE_EFSYS_LOCK_INIT(&sc->enp_lock,
|
||||
device_get_nameunit(sc->dev), "nic");
|
||||
if ((error = efx_nic_create(sc->family, (efsys_identifier_t *)sc,
|
||||
&sc->bar, &sc->enp_lock, &enp)) != 0)
|
||||
goto fail3;
|
||||
@ -537,7 +541,7 @@ fail_tx_ring_entries:
|
||||
fail_rx_ring_entries:
|
||||
sc->enp = NULL;
|
||||
efx_nic_destroy(enp);
|
||||
mtx_destroy(&sc->enp_lock);
|
||||
SFXGE_EFSYS_LOCK_DESTROY(&sc->enp_lock);
|
||||
|
||||
fail3:
|
||||
sfxge_bar_fini(sc);
|
||||
|
@ -122,6 +122,7 @@ struct sfxge_evq {
|
||||
/* Structure members not used on event processing path */
|
||||
unsigned int buf_base_id;
|
||||
unsigned int entries;
|
||||
char lock_name[SFXGE_LOCK_NAME_MAX];
|
||||
} __aligned(CACHE_LINE_SIZE);
|
||||
|
||||
#define SFXGE_NDESCS 1024
|
||||
@ -162,6 +163,9 @@ struct sfxge_mcdi {
|
||||
struct cv cv;
|
||||
enum sfxge_mcdi_state state;
|
||||
efx_mcdi_transport_t transport;
|
||||
|
||||
/* Only used in debugging output */
|
||||
char lock_name[SFXGE_LOCK_NAME_MAX];
|
||||
};
|
||||
|
||||
struct sfxge_hw_stats {
|
||||
@ -186,6 +190,9 @@ struct sfxge_port {
|
||||
struct sfxge_hw_stats phy_stats;
|
||||
struct sfxge_hw_stats mac_stats;
|
||||
efx_link_mode_t link_mode;
|
||||
|
||||
/* Only used in debugging output */
|
||||
char lock_name[SFXGE_LOCK_NAME_MAX];
|
||||
};
|
||||
|
||||
enum sfxge_softc_state {
|
||||
@ -198,6 +205,7 @@ enum sfxge_softc_state {
|
||||
struct sfxge_softc {
|
||||
device_t dev;
|
||||
struct sx softc_lock;
|
||||
char softc_lock_name[SFXGE_LOCK_NAME_MAX];
|
||||
enum sfxge_softc_state init_state;
|
||||
struct ifnet *ifnet;
|
||||
unsigned int if_flags;
|
||||
@ -210,7 +218,7 @@ struct sfxge_softc {
|
||||
caddr_t vpd_data;
|
||||
size_t vpd_size;
|
||||
efx_nic_t *enp;
|
||||
struct mtx enp_lock;
|
||||
efsys_lock_t enp_lock;
|
||||
|
||||
unsigned int rxq_entries;
|
||||
unsigned int txq_entries;
|
||||
@ -249,6 +257,7 @@ struct sfxge_softc {
|
||||
|
||||
#ifndef SFXGE_HAVE_MQ
|
||||
struct mtx tx_lock __aligned(CACHE_LINE_SIZE);
|
||||
char tx_lock_name[SFXGE_LOCK_NAME_MAX];
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -314,8 +323,15 @@ extern int sfxge_port_ifmedia_init(struct sfxge_softc *sc);
|
||||
|
||||
#define SFXGE_MAX_MTU (9 * 1024)
|
||||
|
||||
#define SFXGE_ADAPTER_LOCK_INIT(_sc, _name) \
|
||||
sx_init(&(_sc)->softc_lock, (_name))
|
||||
#define SFXGE_ADAPTER_LOCK_INIT(_sc, _ifname) \
|
||||
do { \
|
||||
struct sfxge_softc *__sc = (_sc); \
|
||||
\
|
||||
snprintf((__sc)->softc_lock_name, \
|
||||
sizeof((__sc)->softc_lock_name), \
|
||||
"%s:softc", (_ifname)); \
|
||||
sx_init(&(__sc)->softc_lock, (__sc)->softc_lock_name); \
|
||||
} while (B_FALSE)
|
||||
#define SFXGE_ADAPTER_LOCK_DESTROY(_sc) \
|
||||
sx_destroy(&(_sc)->softc_lock)
|
||||
#define SFXGE_ADAPTER_LOCK(_sc) \
|
||||
@ -325,8 +341,16 @@ extern int sfxge_port_ifmedia_init(struct sfxge_softc *sc);
|
||||
#define SFXGE_ADAPTER_LOCK_ASSERT_OWNED(_sc) \
|
||||
sx_assert(&(_sc)->softc_lock, LA_XLOCKED)
|
||||
|
||||
#define SFXGE_PORT_LOCK_INIT(_port, _name) \
|
||||
mtx_init(&(_port)->lock, (_name), NULL, MTX_DEF)
|
||||
#define SFXGE_PORT_LOCK_INIT(_port, _ifname) \
|
||||
do { \
|
||||
struct sfxge_port *__port = (_port); \
|
||||
\
|
||||
snprintf((__port)->lock_name, \
|
||||
sizeof((__port)->lock_name), \
|
||||
"%s:port", (_ifname)); \
|
||||
mtx_init(&(__port)->lock, (__port)->lock_name, \
|
||||
NULL, MTX_DEF); \
|
||||
} while (B_FALSE)
|
||||
#define SFXGE_PORT_LOCK_DESTROY(_port) \
|
||||
mtx_destroy(&(_port)->lock)
|
||||
#define SFXGE_PORT_LOCK(_port) \
|
||||
@ -336,8 +360,16 @@ extern int sfxge_port_ifmedia_init(struct sfxge_softc *sc);
|
||||
#define SFXGE_PORT_LOCK_ASSERT_OWNED(_port) \
|
||||
mtx_assert(&(_port)->lock, MA_OWNED)
|
||||
|
||||
#define SFXGE_MCDI_LOCK_INIT(_mcdi, _name) \
|
||||
mtx_init(&(_mcdi)->lock, (_name), NULL, MTX_DEF)
|
||||
#define SFXGE_MCDI_LOCK_INIT(_mcdi, _ifname) \
|
||||
do { \
|
||||
struct sfxge_mcdi *__mcdi = (_mcdi); \
|
||||
\
|
||||
snprintf((__mcdi)->lock_name, \
|
||||
sizeof((__mcdi)->lock_name), \
|
||||
"%s:mcdi", (_ifname)); \
|
||||
mtx_init(&(__mcdi)->lock, (__mcdi)->lock_name, \
|
||||
NULL, MTX_DEF); \
|
||||
} while (B_FALSE)
|
||||
#define SFXGE_MCDI_LOCK_DESTROY(_mcdi) \
|
||||
mtx_destroy(&(_mcdi)->lock)
|
||||
#define SFXGE_MCDI_LOCK(_mcdi) \
|
||||
@ -347,8 +379,16 @@ extern int sfxge_port_ifmedia_init(struct sfxge_softc *sc);
|
||||
#define SFXGE_MCDI_LOCK_ASSERT_OWNED(_mcdi) \
|
||||
mtx_assert(&(_mcdi)->lock, MA_OWNED)
|
||||
|
||||
#define SFXGE_EVQ_LOCK_INIT(_evq, _name) \
|
||||
mtx_init(&(_evq)->lock, (_name), NULL, MTX_DEF)
|
||||
#define SFXGE_EVQ_LOCK_INIT(_evq, _ifname, _evq_index) \
|
||||
do { \
|
||||
struct sfxge_evq *__evq = (_evq); \
|
||||
\
|
||||
snprintf((__evq)->lock_name, \
|
||||
sizeof((__evq)->lock_name), \
|
||||
"%s:evq%u", (_ifname), (_evq_index)); \
|
||||
mtx_init(&(__evq)->lock, (__evq)->lock_name, \
|
||||
NULL, MTX_DEF); \
|
||||
} while (B_FALSE)
|
||||
#define SFXGE_EVQ_LOCK_DESTROY(_evq) \
|
||||
mtx_destroy(&(_evq)->lock)
|
||||
#define SFXGE_EVQ_LOCK(_evq) \
|
||||
|
@ -832,7 +832,7 @@ sfxge_ev_qinit(struct sfxge_softc *sc, unsigned int index)
|
||||
sfxge_sram_buf_tbl_alloc(sc, EFX_EVQ_NBUFS(evq->entries),
|
||||
&evq->buf_base_id);
|
||||
|
||||
SFXGE_EVQ_LOCK_INIT(evq, "evq");
|
||||
SFXGE_EVQ_LOCK_INIT(evq, device_get_nameunit(sc->dev), index);
|
||||
|
||||
evq->init_state = SFXGE_EVQ_INITIALIZED;
|
||||
|
||||
|
@ -201,7 +201,7 @@ sfxge_mcdi_init(struct sfxge_softc *sc)
|
||||
KASSERT(mcdi->state == SFXGE_MCDI_UNINITIALIZED,
|
||||
("MCDI already initialized"));
|
||||
|
||||
SFXGE_MCDI_LOCK_INIT(mcdi, "sfxge_mcdi");
|
||||
SFXGE_MCDI_LOCK_INIT(mcdi, device_get_nameunit(sc->dev));
|
||||
|
||||
mcdi->state = SFXGE_MCDI_INITIALIZED;
|
||||
|
||||
|
@ -583,7 +583,7 @@ sfxge_port_init(struct sfxge_softc *sc)
|
||||
|
||||
port->sc = sc;
|
||||
|
||||
SFXGE_PORT_LOCK_INIT(port, "sfxge_port");
|
||||
SFXGE_PORT_LOCK_INIT(port, device_get_nameunit(sc->dev));
|
||||
|
||||
port->phy_stats.decode_buf = malloc(EFX_PHY_NSTATS * sizeof(uint32_t),
|
||||
M_SFXGE, M_WAITOK | M_ZERO);
|
||||
|
@ -1467,7 +1467,7 @@ sfxge_tx_qinit(struct sfxge_softc *sc, unsigned int txq_index,
|
||||
stdp->std_get_non_tcp_max = sfxge_tx_dpl_get_non_tcp_max;
|
||||
stdp->std_getp = &stdp->std_get;
|
||||
|
||||
SFXGE_TXQ_LOCK_INIT(txq, "txq");
|
||||
SFXGE_TXQ_LOCK_INIT(txq, device_get_nameunit(sc->dev), txq_index);
|
||||
|
||||
SYSCTL_ADD_UINT(device_get_sysctl_ctx(sc->dev),
|
||||
SYSCTL_CHILDREN(txq_node), OID_AUTO,
|
||||
|
@ -130,8 +130,16 @@ enum sfxge_txq_type {
|
||||
#define SFXGE_TX_SCALE(sc) 1
|
||||
#endif
|
||||
|
||||
#define SFXGE_TXQ_LOCK_INIT(_txq, _name) \
|
||||
mtx_init(&(_txq)->lock, (_name), NULL, MTX_DEF)
|
||||
#define SFXGE_TXQ_LOCK_INIT(_txq, _ifname, _txq_index) \
|
||||
do { \
|
||||
struct sfxge_txq *__txq = (_txq); \
|
||||
\
|
||||
snprintf((__txq)->lock_name, \
|
||||
sizeof((__txq)->lock_name), \
|
||||
"%s:txq%u", (_ifname), (_txq_index)); \
|
||||
mtx_init(&(__txq)->lock, (__txq)->lock_name, \
|
||||
NULL, MTX_DEF); \
|
||||
} while (B_FALSE)
|
||||
#define SFXGE_TXQ_LOCK_DESTROY(_txq) \
|
||||
mtx_destroy(&(_txq)->lock)
|
||||
#define SFXGE_TXQ_LOCK(_txq) \
|
||||
@ -164,6 +172,8 @@ struct sfxge_txq {
|
||||
|
||||
efsys_mem_t *tsoh_buffer;
|
||||
|
||||
char lock_name[SFXGE_LOCK_NAME_MAX];
|
||||
|
||||
/* This field changes more often and is read regularly on both
|
||||
* the initiation and completion paths
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user