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:
Andrew Rybchenko 2015-02-05 11:39:15 +00:00
parent ed1ffc3b4b
commit 33d45dc5e4
8 changed files with 111 additions and 25 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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) \

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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,

View File

@ -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
*/