summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/dls/dls.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/io/dls/dls.c')
-rw-r--r--usr/src/uts/common/io/dls/dls.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/usr/src/uts/common/io/dls/dls.c b/usr/src/uts/common/io/dls/dls.c
index 0968818e07..dbf4edc280 100644
--- a/usr/src/uts/common/io/dls/dls.c
+++ b/usr/src/uts/common/io/dls/dls.c
@@ -43,10 +43,18 @@
#include <sys/dls.h>
#include <sys/dls_impl.h>
+#include <sys/dls_soft_ring.h>
static kmem_cache_t *i_dls_impl_cachep;
static uint32_t i_dls_impl_count;
+static kstat_t *dls_ksp = (kstat_t *)NULL;
+struct dls_kstats dls_kstat =
+{
+ { "soft_ring_pkt_drop", KSTAT_DATA_UINT32 },
+};
+
+
/*
* Private functions.
*/
@@ -257,6 +265,27 @@ vlan:
dhip->dhi_vid = VLAN_ID(tci);
}
+static void
+dls_stat_init()
+{
+ if ((dls_ksp = kstat_create("dls", 0, "dls_stat",
+ "net", KSTAT_TYPE_NAMED,
+ sizeof (dls_kstat) / sizeof (kstat_named_t),
+ KSTAT_FLAG_VIRTUAL)) == NULL) {
+ cmn_err(CE_WARN,
+ "DLS: failed to create kstat structure for dls stats");
+ return;
+ }
+ dls_ksp->ks_data = (void *)&dls_kstat;
+ kstat_install(dls_ksp);
+}
+
+static void
+dls_stat_destroy()
+{
+ kstat_delete(dls_ksp);
+}
+
/*
* Module initialization functions.
*/
@@ -271,6 +300,8 @@ dls_init(void)
sizeof (dls_impl_t), 0, i_dls_constructor, i_dls_destructor, NULL,
NULL, NULL, 0);
ASSERT(i_dls_impl_cachep != NULL);
+ soft_ring_init();
+ dls_stat_init();
}
int
@@ -286,6 +317,7 @@ dls_fini(void)
* Destroy the kmem_cache.
*/
kmem_cache_destroy(i_dls_impl_cachep);
+ dls_stat_destroy();
return (0);
}
@@ -423,6 +455,14 @@ dls_close(dls_channel_t dc)
*/
dip->di_dvp = NULL;
dip->di_txinfo = NULL;
+
+ if (dip->di_soft_ring_list != NULL) {
+ soft_ring_set_destroy(dip->di_soft_ring_list,
+ dip->di_soft_ring_size);
+ dip->di_soft_ring_list = NULL;
+ }
+ dip->di_soft_ring_size = 0;
+
kmem_cache_free(i_dls_impl_cachep, dip);
/*