svn commit: r302986 - in head/sys/dev/hyperv: include vmbus
Sepherosa Ziehau
sephe at FreeBSD.org
Mon Jul 18 05:36:32 UTC 2016
Author: sephe
Date: Mon Jul 18 05:36:31 2016
New Revision: 302986
URL: https://svnweb.freebsd.org/changeset/base/302986
Log:
hyperv/vmbus: Cosmetic vmbus channel open cleanup
MFC after: 1 week
Sponsored by: Microsoft OSTC
Differential Revision: https://reviews.freebsd.org/D7217
Modified:
head/sys/dev/hyperv/include/hyperv.h
head/sys/dev/hyperv/vmbus/hv_channel.c
head/sys/dev/hyperv/vmbus/vmbus_reg.h
Modified: head/sys/dev/hyperv/include/hyperv.h
==============================================================================
--- head/sys/dev/hyperv/include/hyperv.h Mon Jul 18 05:00:01 2016 (r302985)
+++ head/sys/dev/hyperv/include/hyperv.h Mon Jul 18 05:36:31 2016 (r302986)
@@ -276,15 +276,9 @@ hv_set_channel_read_state(hv_vmbus_chann
channel->ch_flags |= VMBUS_CHAN_FLAG_BATCHREAD;
}
-int hv_vmbus_channel_open(
- hv_vmbus_channel* channel,
- uint32_t send_ring_buffer_size,
- uint32_t recv_ring_buffer_size,
- void* user_data,
- uint32_t user_data_len,
- vmbus_chan_callback_t cb,
- void *cbarg);
-
+int hv_vmbus_channel_open(struct hv_vmbus_channel *chan,
+ int txbr_size, int rxbr_size, const void *udata, int udlen,
+ vmbus_chan_callback_t cb, void *cbarg);
void hv_vmbus_channel_close(hv_vmbus_channel *channel);
struct hv_vmbus_channel* vmbus_select_outgoing_channel(struct hv_vmbus_channel *promary);
Modified: head/sys/dev/hyperv/vmbus/hv_channel.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel.c Mon Jul 18 05:00:01 2016 (r302985)
+++ head/sys/dev/hyperv/vmbus/hv_channel.c Mon Jul 18 05:36:31 2016 (r302986)
@@ -201,93 +201,75 @@ vmbus_chan_sysctl_create(struct hv_vmbus
}
}
-/**
- * @brief Open the specified channel
- */
int
-hv_vmbus_channel_open(
- hv_vmbus_channel* new_channel,
- uint32_t send_ring_buffer_size,
- uint32_t recv_ring_buffer_size,
- void* user_data,
- uint32_t user_data_len,
- vmbus_chan_callback_t cb,
- void *cbarg)
+hv_vmbus_channel_open(struct hv_vmbus_channel *chan,
+ int txbr_size, int rxbr_size, const void *udata, int udlen,
+ vmbus_chan_callback_t cb, void *cbarg)
{
- struct vmbus_softc *sc = new_channel->vmbus_sc;
+ struct vmbus_softc *sc = chan->vmbus_sc;
const struct vmbus_chanmsg_chopen_resp *resp;
const struct vmbus_message *msg;
struct vmbus_chanmsg_chopen *req;
struct vmbus_msghc *mh;
uint32_t status;
- int ret = 0;
+ int error;
uint8_t *br;
- if (user_data_len > VMBUS_CHANMSG_CHOPEN_UDATA_SIZE) {
+ if (udlen > VMBUS_CHANMSG_CHOPEN_UDATA_SIZE) {
device_printf(sc->vmbus_dev,
- "invalid udata len %u for chan%u\n",
- user_data_len, new_channel->ch_id);
+ "invalid udata len %d for chan%u\n", udlen, chan->ch_id);
return EINVAL;
}
- KASSERT((send_ring_buffer_size & PAGE_MASK) == 0,
+ KASSERT((txbr_size & PAGE_MASK) == 0,
("send bufring size is not multiple page"));
- KASSERT((recv_ring_buffer_size & PAGE_MASK) == 0,
+ KASSERT((rxbr_size & PAGE_MASK) == 0,
("recv bufring size is not multiple page"));
- if (atomic_testandset_int(&new_channel->ch_stflags,
+ if (atomic_testandset_int(&chan->ch_stflags,
VMBUS_CHAN_ST_OPENED_SHIFT))
- panic("double-open chan%u", new_channel->ch_id);
+ panic("double-open chan%u", chan->ch_id);
- new_channel->ch_cb = cb;
- new_channel->ch_cbarg = cbarg;
+ chan->ch_cb = cb;
+ chan->ch_cbarg = cbarg;
- vmbus_chan_update_evtflagcnt(sc, new_channel);
+ vmbus_chan_update_evtflagcnt(sc, chan);
- new_channel->ch_tq = VMBUS_PCPU_GET(new_channel->vmbus_sc, event_tq,
- new_channel->ch_cpuid);
- if (new_channel->ch_flags & VMBUS_CHAN_FLAG_BATCHREAD) {
- TASK_INIT(&new_channel->ch_task, 0, vmbus_chan_task,
- new_channel);
- } else {
- TASK_INIT(&new_channel->ch_task, 0, vmbus_chan_task_nobatch,
- new_channel);
- }
+ chan->ch_tq = VMBUS_PCPU_GET(chan->vmbus_sc, event_tq, chan->ch_cpuid);
+ if (chan->ch_flags & VMBUS_CHAN_FLAG_BATCHREAD)
+ TASK_INIT(&chan->ch_task, 0, vmbus_chan_task, chan);
+ else
+ TASK_INIT(&chan->ch_task, 0, vmbus_chan_task_nobatch, chan);
/*
* Allocate the TX+RX bufrings.
* XXX should use ch_dev dtag
*/
br = hyperv_dmamem_alloc(bus_get_dma_tag(sc->vmbus_dev),
- PAGE_SIZE, 0, send_ring_buffer_size + recv_ring_buffer_size,
- &new_channel->ch_bufring_dma, BUS_DMA_WAITOK | BUS_DMA_ZERO);
+ PAGE_SIZE, 0, txbr_size + rxbr_size, &chan->ch_bufring_dma,
+ BUS_DMA_WAITOK | BUS_DMA_ZERO);
if (br == NULL) {
device_printf(sc->vmbus_dev, "bufring allocation failed\n");
- ret = ENOMEM;
+ error = ENOMEM;
goto failed;
}
- new_channel->ch_bufring = br;
+ chan->ch_bufring = br;
/* TX bufring comes first */
- hv_vmbus_ring_buffer_init(&new_channel->outbound,
- br, send_ring_buffer_size);
+ hv_vmbus_ring_buffer_init(&chan->outbound, br, txbr_size);
/* RX bufring immediately follows TX bufring */
- hv_vmbus_ring_buffer_init(&new_channel->inbound,
- br + send_ring_buffer_size, recv_ring_buffer_size);
+ hv_vmbus_ring_buffer_init(&chan->inbound, br + txbr_size, rxbr_size);
/* Create sysctl tree for this channel */
- vmbus_chan_sysctl_create(new_channel);
+ vmbus_chan_sysctl_create(chan);
/*
* Connect the bufrings, both RX and TX, to this channel.
*/
- ret = vmbus_chan_gpadl_connect(new_channel,
- new_channel->ch_bufring_dma.hv_paddr,
- send_ring_buffer_size + recv_ring_buffer_size,
- &new_channel->ch_bufring_gpadl);
- if (ret != 0) {
+ error = vmbus_chan_gpadl_connect(chan, chan->ch_bufring_dma.hv_paddr,
+ txbr_size + rxbr_size, &chan->ch_bufring_gpadl);
+ if (error) {
device_printf(sc->vmbus_dev,
- "failed to connect bufring GPADL to chan%u\n",
- new_channel->ch_id);
+ "failed to connect bufring GPADL to chan%u\n", chan->ch_id);
goto failed;
}
@@ -298,26 +280,26 @@ hv_vmbus_channel_open(
if (mh == NULL) {
device_printf(sc->vmbus_dev,
"can not get msg hypercall for chopen(chan%u)\n",
- new_channel->ch_id);
- ret = ENXIO;
+ chan->ch_id);
+ error = ENXIO;
goto failed;
}
req = vmbus_msghc_dataptr(mh);
req->chm_hdr.chm_type = VMBUS_CHANMSG_TYPE_CHOPEN;
- req->chm_chanid = new_channel->ch_id;
- req->chm_openid = new_channel->ch_id;
- req->chm_gpadl = new_channel->ch_bufring_gpadl;
- req->chm_vcpuid = new_channel->ch_vcpuid;
- req->chm_rxbr_pgofs = send_ring_buffer_size >> PAGE_SHIFT;
- if (user_data_len)
- memcpy(req->chm_udata, user_data, user_data_len);
+ req->chm_chanid = chan->ch_id;
+ req->chm_openid = chan->ch_id;
+ req->chm_gpadl = chan->ch_bufring_gpadl;
+ req->chm_vcpuid = chan->ch_vcpuid;
+ req->chm_txbr_pgcnt = txbr_size >> PAGE_SHIFT;
+ if (udlen > 0)
+ memcpy(req->chm_udata, udata, udlen);
- ret = vmbus_msghc_exec(sc, mh);
- if (ret != 0) {
+ error = vmbus_msghc_exec(sc, mh);
+ if (error) {
device_printf(sc->vmbus_dev,
"chopen(chan%u) msg hypercall exec failed: %d\n",
- new_channel->ch_id, ret);
+ chan->ch_id, error);
vmbus_msghc_put(sc, mh);
goto failed;
}
@@ -331,28 +313,25 @@ hv_vmbus_channel_open(
if (status == 0) {
if (bootverbose) {
device_printf(sc->vmbus_dev, "chan%u opened\n",
- new_channel->ch_id);
+ chan->ch_id);
}
return 0;
}
- device_printf(sc->vmbus_dev, "failed to open chan%u\n",
- new_channel->ch_id);
- ret = ENXIO;
+ device_printf(sc->vmbus_dev, "failed to open chan%u\n", chan->ch_id);
+ error = ENXIO;
failed:
- if (new_channel->ch_bufring_gpadl) {
- vmbus_chan_gpadl_disconnect(new_channel,
- new_channel->ch_bufring_gpadl);
- new_channel->ch_bufring_gpadl = 0;
- }
- if (new_channel->ch_bufring != NULL) {
- hyperv_dmamem_free(&new_channel->ch_bufring_dma,
- new_channel->ch_bufring);
- new_channel->ch_bufring = NULL;
+ if (chan->ch_bufring_gpadl) {
+ vmbus_chan_gpadl_disconnect(chan, chan->ch_bufring_gpadl);
+ chan->ch_bufring_gpadl = 0;
}
- atomic_clear_int(&new_channel->ch_stflags, VMBUS_CHAN_ST_OPENED);
- return ret;
+ if (chan->ch_bufring != NULL) {
+ hyperv_dmamem_free(&chan->ch_bufring_dma, chan->ch_bufring);
+ chan->ch_bufring = NULL;
+ }
+ atomic_clear_int(&chan->ch_stflags, VMBUS_CHAN_ST_OPENED);
+ return error;
}
int
Modified: head/sys/dev/hyperv/vmbus/vmbus_reg.h
==============================================================================
--- head/sys/dev/hyperv/vmbus/vmbus_reg.h Mon Jul 18 05:00:01 2016 (r302985)
+++ head/sys/dev/hyperv/vmbus/vmbus_reg.h Mon Jul 18 05:36:31 2016 (r302986)
@@ -202,7 +202,7 @@ struct vmbus_chanmsg_chopen {
uint32_t chm_openid;
uint32_t chm_gpadl;
uint32_t chm_vcpuid;
- uint32_t chm_rxbr_pgofs;
+ uint32_t chm_txbr_pgcnt;
#define VMBUS_CHANMSG_CHOPEN_UDATA_SIZE 120
uint8_t chm_udata[VMBUS_CHANMSG_CHOPEN_UDATA_SIZE];
} __packed;
More information about the svn-src-head
mailing list