On Fri, May 30, 2025 at 01:14:55PM -0300, Jason Gunthorpe wrote:
On Sat, May 17, 2025 at 08:21:31PM -0700, Nicolin Chen wrote:
- offset =
cmd->nesting_parent_iova - PAGE_ALIGN(cmd->nesting_parent_iova);
- max_npages = DIV_ROUND_UP(offset + cmd->length, PAGE_SIZE);
This should probably be capped to PAGE_SIZE/sizeof(void *), return EINVAL if not
Hmm, mind elaborating where this PAGE_SIZE/sizeof comes from?
- hw_queue = viommu->ops->hw_queue_alloc(ucmd, viommu, cmd->type,
cmd->index,
cmd->nesting_parent_iova,
cmd->length);
- if (IS_ERR(hw_queue)) {
rc = PTR_ERR(hw_queue);
goto out_unpin;
- }
- /* The iommufd_hw_queue_alloc helper saves ictx in hw_queue->ictx */
- if (WARN_ON_ONCE(hw_queue->ictx != ucmd->ictx)) {
rc = -EINVAL;
goto out_unpin;
- }
There is another technique from RDMA which may actually be very helpful here considering how things are getting split up..
Put a size_t in the driver ops:
size_t size_viommu; size_t size_hw_queue;
Have the driver set it via a macro like INIT_RDMA_OBJ_SIZE
#define INIT_RDMA_OBJ_SIZE(ib_struct, drv_struct, member) \ .size_##ib_struct = \ (sizeof(struct drv_struct) + \ BUILD_BUG_ON_ZERO(offsetof(struct drv_struct, member)) + \ BUILD_BUG_ON_ZERO( \ !__same_type(((struct drv_struct *)NULL)->member, \ struct ib_struct)))
Which proves the core structure is at the front.
Then the core code can allocate the object along with enough space for the driver and call a driver function to init the driver portion of the already allocated object.
That's interesting! Then all "_alloc" ops would be "_init" instead.
Then you don't need these dances where the driver helper has to do things like set uctx, or the core structure is partially initialized:
- hw_queue->viommu = viommu;
- refcount_inc(&viommu->obj.users);
- hw_queue->length = cmd->length;
- hw_queue->base_addr = cmd->nesting_parent_iova;
When the driver is running, which can be a source of bugs.
Hmm, I don't quite follow the "bugs" here. Any example?
This would be useful for the existing ops too.
May reduce the size of the linked in code.
Yes! Haven't tried that yet, but sounds like we could move quite a few things back to the private header.
Perhaps a smaller cleanup series first to the existing code.
Thanks! Nicolin