hyperv/stor: Avoid sub-channel creation callback.

Since the sub-channel offers are synchronized, we can do our own
channel setup without using the sub-channel creation callback.

This paves the way to whack the sub-channel creation callback.

MFC after:	1 week
Sponsored by:	Microsoft OSTC
This commit is contained in:
Sepherosa Ziehau 2016-04-26 05:15:15 +00:00
parent 03dbe733c5
commit 99b476b1e8

View File

@ -315,21 +315,14 @@ get_stor_device(struct hv_device *device,
return sc; return sc;
} }
/**
* @brief Callback handler, will be invoked when receive mutil-channel offer
*
* @param context new multi-channel
*/
static void static void
storvsc_handle_sc_creation(void *context) storvsc_subchan_attach(struct hv_vmbus_channel *new_channel)
{ {
hv_vmbus_channel *new_channel;
struct hv_device *device; struct hv_device *device;
struct storvsc_softc *sc; struct storvsc_softc *sc;
struct vmstor_chan_props props; struct vmstor_chan_props props;
int ret = 0; int ret = 0;
new_channel = (hv_vmbus_channel *)context;
device = new_channel->device; device = new_channel->device;
sc = get_stor_device(device, TRUE); sc = get_stor_device(device, TRUE);
if (sc == NULL) if (sc == NULL)
@ -362,7 +355,7 @@ storvsc_send_multichannel_request(struct hv_device *dev, int max_chans)
struct hv_storvsc_request *request; struct hv_storvsc_request *request;
struct vstor_packet *vstor_packet; struct vstor_packet *vstor_packet;
int request_channels_cnt = 0; int request_channels_cnt = 0;
int ret; int ret, i;
/* get multichannels count that need to create */ /* get multichannels count that need to create */
request_channels_cnt = MIN(max_chans, mp_ncpus); request_channels_cnt = MIN(max_chans, mp_ncpus);
@ -376,9 +369,6 @@ storvsc_send_multichannel_request(struct hv_device *dev, int max_chans)
request = &sc->hs_init_req; request = &sc->hs_init_req;
/* Establish a handler for multi-channel */
dev->channel->sc_creation_callback = storvsc_handle_sc_creation;
/* request the host to create multi-channel */ /* request the host to create multi-channel */
memset(request, 0, sizeof(struct hv_storvsc_request)); memset(request, 0, sizeof(struct hv_storvsc_request));
@ -414,10 +404,14 @@ storvsc_send_multichannel_request(struct hv_device *dev, int max_chans)
return; return;
} }
/* /* Wait for sub-channels setup to complete. */
* Wait for sub-channels setup to complete.
*/
subchan = vmbus_get_subchan(dev->channel, request_channels_cnt); subchan = vmbus_get_subchan(dev->channel, request_channels_cnt);
/* Attach the sub-channels. */
for (i = 0; i < request_channels_cnt; ++i)
storvsc_subchan_attach(subchan[i]);
/* Release the sub-channels. */
vmbus_rel_subchan(subchan, request_channels_cnt); vmbus_rel_subchan(subchan, request_channels_cnt);
if (bootverbose) if (bootverbose)