ping the series > > As we don't use any token there's no reason to not queue directly instead > of passing through RedCharDevice. > This will make easier to limit the queue which currently is unlimited. > > RedCharDevice flow control has some problems: > - it's really designed with VDI in mind. This for SpiceVMC would cause > code implementation to be confusing having to satisfy the agent token > handling; > - it's using items as unit not allowing counting bytes; > - it duplicates some queue management between RedChannelClient; > - it's broken (see comments in char-device.h); > - it forces "clients" to behave in some way not altering for instance the > queued items (which is very useful if items can be collapsed together); > - it replicates the token handling on the device queue too. This could > seems right but is not that if you have a network card going @ 1 GBit/s > you are able to upload more than 1 Gbit/s just using multiple > connections. The kernel will use a single queue for the network interface > limiting and sharing de facto the various buffers between the multiple > connections. > > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > --- > Changes in v2: > - more commit message comments > --- > server/spicevmc.c | 15 +++++---------- > 1 file changed, 5 insertions(+), 10 deletions(-) > > diff --git a/server/spicevmc.c b/server/spicevmc.c > index 84bbb73c2..8c41573ae 100644 > --- a/server/spicevmc.c > +++ b/server/spicevmc.c > @@ -360,29 +360,24 @@ static RedPipeItem > *spicevmc_chardev_read_msg_from_dev(RedCharDevice *self, > > msg_item_compressed = try_compress_lz4(channel, n, msg_item); > if (msg_item_compressed != NULL) { > - return &msg_item_compressed->base; > + red_channel_client_pipe_add_push(channel->rcc, > &msg_item_compressed->base); > + return NULL; > } > #endif > stat_inc_counter(channel->out_data, n); > msg_item->uncompressed_data_size = n; > msg_item->buf_used = n; > - return &msg_item->base; > - } else { > - channel->pipe_item = msg_item; > + red_channel_client_pipe_add_push(channel->rcc, &msg_item->base); > return NULL; > } > + channel->pipe_item = msg_item; > + return NULL; > } > > static void spicevmc_chardev_send_msg_to_client(RedCharDevice *self, > RedPipeItem *msg, > RedClient *client) > { > - RedCharDeviceSpiceVmc *vmc = RED_CHAR_DEVICE_SPICEVMC(self); > - RedVmcChannel *channel = RED_VMC_CHANNEL(vmc->channel); > - > - spice_assert(red_channel_client_get_client(channel->rcc) == client); > - red_pipe_item_ref(msg); > - red_channel_client_pipe_add_push(channel->rcc, msg); > } > > static void red_port_init_item_free(struct RedPipeItem *base) _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel