sched_impl.c revision fc10aa482a49e233a416c80fd303cf3b857329eb
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
*/
#include <stdio.h>
#include <sys/mdb_modapi.h>
#include "crypto_cmds.h"
static void
prt_an_state(int state)
{
switch (state) {
case REQ_ALLOCATED:
mdb_printf("REQ_ALLOCATED ");
break;
case REQ_WAITING:
mdb_printf("REQ_WAITING ");
break;
case REQ_INPROGRESS:
mdb_printf("REQ_INPROGRESS ");
break;
case REQ_DONE:
mdb_printf("REQ_DONE ");
break;
case REQ_CANCELED:
mdb_printf("REQ_CANCELED ");
break;
default:
break;
}
}
static const mdb_bitmask_t call_flags[] = {
{ NULL, 0, 0 }
};
/*ARGSUSED*/
static int
{
mdb_printf("\nan_type: ");
else
mdb_printf("CRYPTO_ASYNCH");
mdb_printf("\nan_state: ");
"B_FALSE" : "B_TRUE");
return (DCMD_OK);
}
/*
* Verbose print of kcf_areq_node_t
*/
static int
{
/* contents only -- the address is printed elsewhere */
/* First column */
else
mdb_printf("CRYPTO_ASYNCH");
/* Second column */
/* First column */
/* Second column */
/* First column again */
/* Second column */
/* First column again */
/* Second column */
/* First column again */
/* Second column */
/* First column again */
areqn->an_context);
/* Second column */
/* First column again */
/* Second column */
/* First column again */
/* Second column */
/* First column again */
areqn->an_provider);
/* Second column */
/* First column again */
/* Second column */
/* First column again */
return (DCMD_OK);
}
/*ARGSUSED*/
int
{
return (DCMD_USAGE);
/*
* read even if we're looping, because the cbdata design does not
* apply to mdb_pwalk_dcmd
*/
return (DCMD_ERR);
}
if (opt_v) /* verbose */
return (v_kcf_areq_node(&areqn));
else
return (kcf_areq_node_simple(&areqn));
}
/*ARGSUSED*/
int
{
if (!(flags & DCMD_ADDRSPEC)) {
== -1) {
mdb_warn("cannot read gswq");
return (DCMD_ERR);
}
}
else
return (DCMD_ERR);
}
}
static int
{
mdb_warn("failed to read 'gswq'");
return (WALK_ERR);
}
return (WALK_ERR);
}
mdb_printf("Global swq is empty\n");
return (WALK_DONE);
}
return (WALK_NEXT);
}
int
{
}
int
{
}
typedef enum idwalk_type {
IDNEXT, /* an_idnext */
IDPREV, /* an_idprev */
CTXCHAIN /* an_ctxchain_next */
static int
{
mdb_warn("must give kcf_areq_node address\n");
return (WALK_ERR);
}
return (WALK_ERR);
}
switch (type) {
case IDNEXT:
break;
case IDPREV:
break;
case CTXCHAIN:
break;
default:
mdb_warn("Bad structure member in walk_init\n");
return (WALK_ERR);
}
return (WALK_NEXT);
}
int
{
}
int
{
}
int
{
}
/*
* At each step, read a kcf_areq_node_t into our private storage, then invoke
* the callback function. We terminate when we reach a NULL type pointer.
*/
static int
{
int status;
return (WALK_DONE);
return (WALK_ERR);
}
wsp->walk_cbdata);
switch (type) {
case IDNEXT:
return (WALK_DONE);
break;
case IDPREV:
return (WALK_DONE);
break;
case CTXCHAIN:
return (WALK_DONE);
break;
default:
mdb_warn("Bad structure member in walk_step\n");
return (WALK_ERR);
}
return (status);
}
int
{
}
int
{
}
int
{
}
/*
* The walker's fini function is invoked at the end of each walk. Since we
* dynamically allocated a kcf_areq_node_t in areq_walk_init,
* we must free it now.
*/
void
{
#ifdef DEBUG
mdb_printf("...end of kcf_areq_node walk\n");
#endif
}
/*
* At each step, read a kcf_areq_node_t into our private storage, then invoke
* the callback function. We terminate when we reach a NULL an_next pointer
* or a NULL an_prev pointer. use_next flag indicates which one to check.
*/
static int
{
int status;
return (WALK_DONE);
}
wsp->walk_cbdata);
return (WALK_DONE);
return (status);
}
int
{
}
int
{
}
/*
* Walker data for reqid_table walking
*/
typedef struct reqid_data {
int rd_cur_index;
} reqid_data_t;
typedef struct reqid_cb_data {
int verbose;
int found;
int
{
/* see if the walker was called from the command line or mdb_pwalk */
mdb_warn("couldn't get cb memory for "
"reqid_table_walker");
return (WALK_ERR);
}
/* initialize for a simple walk, as opposed to a reqid search */
}
"kcf_reqid_table") == -1) {
mdb_warn("failed to read 'kcf_reqid_table'");
return (WALK_ERR);
}
wdata->rd_cur_index = 0;
return (WALK_NEXT);
}
/*
* At each step, read a kcf_reqid_table_t into our private storage, then invoke
* the callback function. We terminate when we reach a
*/
int
{
int status;
#ifdef DEBUG
"DEBUG: kcf_reqid_table at %p, sizeof kcf_reqid_table_t = %d\n",
#endif
wsp->walk_cbdata);
/* get ready for next call */
wdata->rd_cur_index++;
return (WALK_DONE);
return (status);
}
/*
* The walker's fini function is invoked at the end of each walk. Since we
* dynamically allocated a reqid_data_t in areq_walk_init,
* we must free it now.
*/
void
{
#ifdef DEBUG
mdb_printf("...end of kcf_reqid walk\n");
#endif
}
/*
* If there's an argument beyond -v, then we're looking for a specific
* reqid, otherwise, print any non-null kcf_areq things we run across.
*/
int
{
int i;
return (WALK_NEXT);
}
addr) == -1) {
mdb_warn("failed to read kcf_reqid_table at %p",
addr);
return (WALK_ERR);
}
/* Loop over all rt_idhash's */
for (i = 0; i < REQID_BUCKETS; i++) {
uint_t number_in_chain = 0;
/* follow the an_idnext chains for each bucket */
do {
/* read kcf_areq_node */
if (number_in_chain == 0)
else
/*LINTED*/
#ifdef DEBUG
#endif
break; /* skip */
== -1) {
"cannot read rt_idhash %d an_idnext %d\n",
i, number_in_chain);
break;
}
/* see if we want to print it */
/* is this the first rd_idhash found for this table? */
/* print both indices in bold */
mdb_printf("%<b>kcf_reqid_table[%lu] at %p:%</b>\n",
mdb_printf("\trt_lock: %p\trt_curid: %llx\n",
}
/* print kcf_areq_node */
if (number_in_chain < 1)
" %<b>rt_idhash[%lu%]%</b> = %<b>%p:%</b>\n",
i, node_addr);
else
" rt_idhash[%lu%]"
" an_idnext %d = %<b>%p:%</b>\n",
i, number_in_chain, node_addr);
mdb_inc_indent(8);
/* if we're looking for one and only one reqid */
/* do it REALLY verbose */
/*
* verbose for this walker means non-verbose for
* the kcf_areq_node details
*/
mdb_dec_indent(8);
}
/* if we only wanted one reqid, quit now */
return (WALK_DONE);
}
} /* for each REQID_BUCKETS */
mdb_printf("%kcf_reqid_table[%lu]: %p\n",
}
return (WALK_NEXT);
}
/*ARGSUSED*/
int
{
int i, status;
if (flags & DCMD_ADDRSPEC) {
mdb_printf("use addr ::kcf_reqid_table\n");
return (DCMD_USAGE);
}
if (argc - i > 1)
return (DCMD_USAGE);
}
if (argc > i)
else
}
#ifdef DEBUG
else
mdb_printf("DEBUG: cbdata.db_reqid = %lx, cbdata.found = %d\n",
#endif
return (status);
}
int
{
if (!(flags & DCMD_ADDRSPEC))
return (DCMD_USAGE);
return (DCMD_USAGE);
}
return (DCMD_OK);
}