diff --git a/fops.c b/fops.c index 11eb6e4..340230a 100644 --- a/fops.c +++ b/fops.c @@ -240,7 +240,7 @@ static unsigned int mxdma_device_poll(struct file *file, poll_table *wait) struct mx_pci_dev *mx_pdev; struct mx_event *mx_event; unsigned int mask = 0; - int flag; + int count; mx_cdev = (struct mx_char_dev *)file->private_data; if (!mx_cdev) { @@ -271,11 +271,11 @@ static unsigned int mxdma_device_poll(struct file *file, poll_table *wait) mx_event = &mx_pdev->event; poll_wait(file, &mx_event->wq, wait); - flag = atomic_read(&mx_event->flag); - if (flag) { + count = atomic_read(&mx_event->count); + if (count > 0) { + atomic_dec(&mx_event->count); mask = POLLIN | POLLRDNORM; } - atomic_set(&mx_event->flag, 0); return mask; } diff --git a/init.c b/init.c index fd62bd0..b203b7d 100644 --- a/init.c +++ b/init.c @@ -12,31 +12,31 @@ static void mx_event_init(struct mx_pci_dev *mx_pdev) struct mx_event *mx_event = &mx_pdev->event; init_waitqueue_head(&mx_event->wq); - atomic_set(&mx_event->flag, 0); + atomic_set(&mx_event->count, 0); } static irqreturn_t msi_irq_handler(int irq, void *data) { - struct mx_pci_dev *mx_pdev; - struct mx_event *mx_event; + struct mx_pci_dev *mx_pdev; + struct mx_event *mx_event; - mx_pdev = (struct mx_pci_dev *)data; - if (mx_pdev == NULL) { - pr_err("Invalid data\n"); - goto out; - } + mx_pdev = (struct mx_pci_dev *)data; + if (mx_pdev == NULL) { + pr_err("Invalid data\n"); + goto out; + } - mx_event = &(mx_pdev->event); - if (mx_event == NULL) { - pr_err("Invalid event\n"); - goto out; - } + mx_event = &(mx_pdev->event); + if (mx_event == NULL) { + pr_err("Invalid event\n"); + goto out; + } - atomic_set(&mx_event->flag, 1); - wake_up_interruptible(&mx_event->wq); + atomic_inc(&mx_event->count); + wake_up_interruptible(&mx_event->wq); out: - return IRQ_HANDLED; + return IRQ_HANDLED; } static void pci_device_exit(struct mx_pci_dev *mx_pdev, struct pci_dev *pdev) @@ -390,7 +390,7 @@ int mxdma_driver_probe(struct pci_dev *pdev, const struct pci_device_id *id, int } pr_info("pci device is probed (vendor=%#x device=%#x bdf=%s cxl=mem%d)\n", - pdev->vendor, pdev->device, dev_name(&pdev->dev), cxl_memdev_id); + pdev->vendor, pdev->device, dev_name(&pdev->dev), cxl_memdev_id); return 0; } diff --git a/mx_dma.h b/mx_dma.h index e38e643..ca9ba24 100644 --- a/mx_dma.h +++ b/mx_dma.h @@ -182,7 +182,7 @@ struct mx_char_dev { }; struct mx_event { - atomic_t flag; + atomic_t count; wait_queue_head_t wq; }; diff --git a/transfer.c b/transfer.c index 5a24f8e..def6870 100644 --- a/transfer.c +++ b/transfer.c @@ -235,7 +235,7 @@ static int mx_command_init_common(struct mx_transfer *transfer, int opcode) id = transfer_id_alloc(transfer); if (id < 0) { - pr_warn("Failed to trasfer_id_alloc\n"); + pr_warn("Failed to trasfer_id_alloc (err=%d)\n", id); return -ENOMEM; } @@ -342,9 +342,12 @@ static int mx_transfer_init_ctrl(struct mx_transfer *transfer, int opcode) static int mx_transfer_destroy_ctrl(struct mx_transfer *transfer) { + struct mx_command *comm = &transfer->cmd; uint64_t value; int ret; + transfer_id_free(comm->id); + if (transfer->dir != DMA_FROM_DEVICE) return 0;