struct cxl_context *cxl_dev_context_init(struct pci_dev *dev) { struct address_space *mapping; struct cxl_afu *afu; struct cxl_context *ctx; int rc; afu = cxl_pci_to_afu(dev); ctx = cxl_context_alloc(); if (IS_ERR(ctx)) { rc = PTR_ERR(ctx); goto err_dev; } ctx->kernelapi = true; /* * Make our own address space since we won't have one from the * filesystem like the user api has, and even if we do associate a file * with this context we don't want to use the global anonymous inode's * address space as that can invalidate unrelated users: */ mapping = kmalloc(sizeof(struct address_space), GFP_KERNEL); if (!mapping) { rc = -ENOMEM; goto err_ctx; } address_space_init_once(mapping); /* Make it a slave context. We can promote it later? */ rc = cxl_context_init(ctx, afu, false, mapping); if (rc) goto err_mapping; cxl_assign_psn_space(ctx); return ctx; err_mapping: kfree(mapping); err_ctx: kfree(ctx); err_dev: return ERR_PTR(rc); }
struct cxl_context *cxl_dev_context_init(struct pci_dev *dev) { struct cxl_afu *afu; struct cxl_context *ctx; int rc; afu = cxl_pci_to_afu(dev); get_device(&afu->dev); ctx = cxl_context_alloc(); if (IS_ERR(ctx)) return ctx; /* Make it a slave context. We can promote it later? */ rc = cxl_context_init(ctx, afu, false, NULL); if (rc) { kfree(ctx); put_device(&afu->dev); return ERR_PTR(-ENOMEM); } cxl_assign_psn_space(ctx); return ctx; }
void cxl_set_master(struct cxl_context *ctx) { ctx->master = true; cxl_assign_psn_space(ctx); }