On Sun, Dec 14, 2025 at 02:20:36AM -0500, Michael S. Tsirkin wrote:
> On Fri, Dec 12, 2025 at 04:35:08PM +0100, Matias Ezequiel Vara Larsen wrote:
> > > > +
> > > > + priv->can_ctr_msg.cpkt_out.msg_type = cpu_to_le16(msg_type);
> > > > + sg_init_one(&sg_out, &priv->can_ctr_msg.cpkt_out,
> > > > + sizeof(priv->can_ctr_msg.cpkt_out));
> > > > + sg_init_one(&sg_in, &priv->can_ctr_msg.cpkt_in,
> > > > sizeof(priv->can_ctr_msg.cpkt_in));
> > > > +
> > > > + err = virtqueue_add_sgs(vq, sgs, 1u, 1u, priv, GFP_ATOMIC);
> > > > + if (err != 0) {
> > > > + /* Not expected to happen */
> > > > + dev_err(dev, "%s(): virtqueue_add_sgs() failed\n",
> > > > __func__);
> > > > + mutex_unlock(&priv->ctrl_lock);
> > > > + return VIRTIO_CAN_RESULT_NOT_OK;
> > > > + }
> > > > +
> > > > + if (!virtqueue_kick(vq)) {
> > > > + /* Not expected to happen */
> > > > + dev_err(dev, "%s(): Kick failed\n", __func__);
> > > > + mutex_unlock(&priv->ctrl_lock);
> > > > + return VIRTIO_CAN_RESULT_NOT_OK;
> > > > + }
> > > > +
> > > > + while (!virtqueue_get_buf(vq, &len) && !virtqueue_is_broken(vq))
> > > > + wait_for_completion(&priv->ctrl_done);
> > > > +
> > >
> > > Since the call is synchronous, does can_ctr_msg really need to be part
> > > of priv? Cannot be it allocated from the stack?
> > >
> >
> > I tried to allocate in the stack but the guest blocks when during `ip
> > link set up can0`, any idea?
>
> you can not DMA to/from the stack, really.
>
Right. Forgot aboud DMA, my bad.
> --
> MST
>
>
Regards,
Francesco