On 2021-05-02 7:29 p.m., John Hubbard wrote: > On 4/8/21 10:01 AM, Logan Gunthorpe wrote: >> Introduce a supports_pci_p2pdma() operation in nvme_ctrl_ops to >> replace the fixed NVME_F_PCI_P2PDMA flag such that the dma_map_ops >> flags can be checked for PCI P2PDMA support. >> >> Signed-off-by: Logan Gunthorpe <logang@xxxxxxxxxxxx> >> --- >> drivers/nvme/host/core.c | 3 ++- >> drivers/nvme/host/nvme.h | 2 +- >> drivers/nvme/host/pci.c | 11 +++++++++-- >> 3 files changed, 12 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c >> index 0896e21642be..223419454516 100644 >> --- a/drivers/nvme/host/core.c >> +++ b/drivers/nvme/host/core.c >> @@ -3907,7 +3907,8 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid, >> blk_queue_flag_set(QUEUE_FLAG_STABLE_WRITES, ns->queue); >> >> blk_queue_flag_set(QUEUE_FLAG_NONROT, ns->queue); >> - if (ctrl->ops->flags & NVME_F_PCI_P2PDMA) >> + if (ctrl->ops->supports_pci_p2pdma && >> + ctrl->ops->supports_pci_p2pdma(ctrl)) > > This is a little excessive, as I suspected. How about providing a > default .supports_pci_p2pdma routine that returns false, so that > the op is always available (non-null)? By "default", maybe that > means either requiring an init_the_ops_struct() routine to be > used, and/or checking all the users of struct nvme_ctrl_ops. Honestly that sounds much more messy to me than simply checking if it's NULL before using it (which is a common, accepted pattern for ops). > Another idea: maybe you don't really need a bool .supports_pci_p2pdma() > routine at all, because the existing .flags really is about right. > You just need the flags to be filled in dynamically. So, do that > during nvme_pci setup/init time: that's when this module would call > dma_pci_p2pdma_supported(). If the flag is filled in dynamically, then the ops struct would have to be non-constant. Ops structs should be constant for security reasons. Logan