On Tue, Feb 18, 2025 at 09:47:50AM -0800, Nicolin Chen wrote: > I think we can do: > if (!list_empty(list)) { > struct iommufd_vevent *next; > > next = list_first_entry(list, struct iommufd_vevent, node); > if (next == &veventq->overflow) { > /* Make a copy of the overflow node for copy_to_user */ > vevent = kzalloc(sizeof(*vevent), GFP_ATOMIC); > if (!vevent) > goto out_unlock; > } > list_del(&next->node); > if (vevent) > memcpy(vevent, next, sizeof(*vevent)); > else > vevent = next; > }
That looks right > > > +int iommufd_veventq_alloc(struct iommufd_ucmd *ucmd) > > > +{ > > > + struct iommu_veventq_alloc *cmd = ucmd->cmd; > > > + struct iommufd_veventq *veventq; > > > + struct iommufd_viommu *viommu; > > > + int fdno; > > > + int rc; > > > + > > > + if (cmd->flags || cmd->type == IOMMU_VEVENTQ_TYPE_DEFAULT) > > > + return -EOPNOTSUPP; > > > + if (!cmd->veventq_depth) > > > + return -EINVAL; > > > > Check __reserved for 0 too > > Kevin is suggesting a 32-bit flag field, so I think we can drop > the __reserved in that case. Those are different structs? Jason