Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/hyperv/vmbus/vmbus_chan.c
Show First 20 Lines • Show All 167 Lines • ▼ Show 20 Lines | if (chid_tree == NULL) | ||||
return; | return; | ||||
SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(chid_tree), OID_AUTO, | SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(chid_tree), OID_AUTO, | ||||
"chanid", CTLFLAG_RD, &chan->ch_id, 0, "channel id"); | "chanid", CTLFLAG_RD, &chan->ch_id, 0, "channel id"); | ||||
} | } | ||||
SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(chid_tree), OID_AUTO, | SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(chid_tree), OID_AUTO, | ||||
"cpu", CTLFLAG_RD, &chan->ch_cpuid, 0, "owner CPU id"); | "cpu", CTLFLAG_RD, &chan->ch_cpuid, 0, "owner CPU id"); | ||||
SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(chid_tree), OID_AUTO, | |||||
"send", CTLFLAG_RD, &chan->ch_stat_send_nreq, 0, | |||||
"requests sent from this channel"); | |||||
SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(chid_tree), OID_AUTO, | SYSCTL_ADD_PROC(ctx, SYSCTL_CHILDREN(chid_tree), OID_AUTO, | ||||
"mnf", CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, | "mnf", CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, | ||||
chan, 0, vmbus_chan_sysctl_mnf, "I", | chan, 0, vmbus_chan_sysctl_mnf, "I", | ||||
"has monitor notification facilities"); | "has monitor notification facilities"); | ||||
br_tree = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(chid_tree), OID_AUTO, | br_tree = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(chid_tree), OID_AUTO, | ||||
"br", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, ""); | "br", CTLFLAG_RD | CTLFLAG_MPSAFE, 0, ""); | ||||
if (br_tree != NULL) { | if (br_tree != NULL) { | ||||
▲ Show 20 Lines • Show All 440 Lines • ▼ Show 20 Lines | vmbus_chan_send(struct vmbus_channel *chan, uint16_t type, uint16_t flags, | ||||
iov[1].iov_base = data; | iov[1].iov_base = data; | ||||
iov[1].iov_len = dlen; | iov[1].iov_len = dlen; | ||||
iov[2].iov_base = &pad; | iov[2].iov_base = &pad; | ||||
iov[2].iov_len = pad_pktlen - pktlen; | iov[2].iov_len = pad_pktlen - pktlen; | ||||
error = vmbus_txbr_write(&chan->ch_txbr, iov, 3, &send_evt); | error = vmbus_txbr_write(&chan->ch_txbr, iov, 3, &send_evt); | ||||
if (!error && send_evt) | if (!error && send_evt) | ||||
vmbus_chan_signal_tx(chan); | vmbus_chan_signal_tx(chan); | ||||
// statistc for this channel | |||||
if (!error) { | |||||
chan->ch_stat_send_nreq++; | |||||
} | |||||
return error; | return error; | ||||
} | } | ||||
int | int | ||||
vmbus_chan_send_sglist(struct vmbus_channel *chan, | vmbus_chan_send_sglist(struct vmbus_channel *chan, | ||||
struct vmbus_gpa sg[], int sglen, void *data, int dlen, uint64_t xactid) | struct vmbus_gpa sg[], int sglen, void *data, int dlen, uint64_t xactid) | ||||
{ | { | ||||
struct vmbus_chanpkt_sglist pkt; | struct vmbus_chanpkt_sglist pkt; | ||||
Show All 23 Lines | vmbus_chan_send_sglist(struct vmbus_channel *chan, | ||||
iov[2].iov_base = data; | iov[2].iov_base = data; | ||||
iov[2].iov_len = dlen; | iov[2].iov_len = dlen; | ||||
iov[3].iov_base = &pad; | iov[3].iov_base = &pad; | ||||
iov[3].iov_len = pad_pktlen - pktlen; | iov[3].iov_len = pad_pktlen - pktlen; | ||||
error = vmbus_txbr_write(&chan->ch_txbr, iov, 4, &send_evt); | error = vmbus_txbr_write(&chan->ch_txbr, iov, 4, &send_evt); | ||||
if (!error && send_evt) | if (!error && send_evt) | ||||
vmbus_chan_signal_tx(chan); | vmbus_chan_signal_tx(chan); | ||||
// statistc for this channel | |||||
if (!error) { | |||||
chan->ch_stat_send_nreq++; | |||||
} | |||||
return error; | return error; | ||||
} | } | ||||
int | int | ||||
vmbus_chan_send_prplist(struct vmbus_channel *chan, | vmbus_chan_send_prplist(struct vmbus_channel *chan, | ||||
struct vmbus_gpa_range *prp, int prp_cnt, void *data, int dlen, | struct vmbus_gpa_range *prp, int prp_cnt, void *data, int dlen, | ||||
uint64_t xactid) | uint64_t xactid) | ||||
{ | { | ||||
Show All 25 Lines | vmbus_chan_send_prplist(struct vmbus_channel *chan, | ||||
iov[2].iov_base = data; | iov[2].iov_base = data; | ||||
iov[2].iov_len = dlen; | iov[2].iov_len = dlen; | ||||
iov[3].iov_base = &pad; | iov[3].iov_base = &pad; | ||||
iov[3].iov_len = pad_pktlen - pktlen; | iov[3].iov_len = pad_pktlen - pktlen; | ||||
error = vmbus_txbr_write(&chan->ch_txbr, iov, 4, &send_evt); | error = vmbus_txbr_write(&chan->ch_txbr, iov, 4, &send_evt); | ||||
if (!error && send_evt) | if (!error && send_evt) | ||||
vmbus_chan_signal_tx(chan); | vmbus_chan_signal_tx(chan); | ||||
// statistc for this channel | |||||
if (!error) { | |||||
chan->ch_stat_send_nreq++; | |||||
} | |||||
return error; | return error; | ||||
} | } | ||||
int | int | ||||
vmbus_chan_recv(struct vmbus_channel *chan, void *data, int *dlen0, | vmbus_chan_recv(struct vmbus_channel *chan, void *data, int *dlen0, | ||||
uint64_t *xactid) | uint64_t *xactid) | ||||
{ | { | ||||
struct vmbus_chanpkt_hdr pkt; | struct vmbus_chanpkt_hdr pkt; | ||||
▲ Show 20 Lines • Show All 587 Lines • ▼ Show 20 Lines | TAILQ_FOREACH(chan, &prichan->ch_subchans, ch_sublink) { | ||||
CHAN_SELECT(chan); | CHAN_SELECT(chan); | ||||
} | } | ||||
mtx_unlock(&prichan->ch_subchan_lock); | mtx_unlock(&prichan->ch_subchan_lock); | ||||
#undef CHAN_SELECT | #undef CHAN_SELECT | ||||
#undef CHAN_VCPU_DIST | #undef CHAN_VCPU_DIST | ||||
return sel; | return sel; | ||||
} | |||||
int | |||||
vmbus_chan_array(struct vmbus_channel *pri_chan, | |||||
sepherosa_gmail.com: I don't think we need this. vmbus_subchan_get() is already there. | |||||
struct vmbus_channel **chan_array, int array_max_len) | |||||
{ | |||||
struct vmbus_channel *chan; | |||||
int nchan = 0; | |||||
chan_array[nchan++] = pri_chan; | |||||
if (TAILQ_EMPTY(&pri_chan->ch_subchans)) { | |||||
return nchan; | |||||
} | |||||
mtx_lock(&pri_chan->ch_subchan_lock); | |||||
TAILQ_FOREACH(chan, &pri_chan->ch_subchans, ch_sublink) { | |||||
KASSERT(chan->ch_stflags & VMBUS_CHAN_ST_OPENED, | |||||
("chan%u is not opened", chan->ch_id)); | |||||
KASSERT(nchan + 1 < array_max_len, | |||||
("channel array's capacity %d is reached\n", | |||||
array_max_len)); | |||||
chan_array[nchan++] = chan; | |||||
} | |||||
mtx_unlock(&pri_chan->ch_subchan_lock); | |||||
return nchan; | |||||
} | } | ||||
struct vmbus_channel ** | struct vmbus_channel ** | ||||
vmbus_subchan_get(struct vmbus_channel *pri_chan, int subchan_cnt) | vmbus_subchan_get(struct vmbus_channel *pri_chan, int subchan_cnt) | ||||
{ | { | ||||
struct vmbus_channel **ret, *chan; | struct vmbus_channel **ret, *chan; | ||||
int i; | int i; | ||||
▲ Show 20 Lines • Show All 91 Lines • Show Last 20 Lines |
I don't think we need this. vmbus_subchan_get() is already there.