From aa1b5369ac37acf55783720b9415a5afc2beab50 Mon Sep 17 00:00:00 2001 From: none Date: Thu, 16 Jan 2020 10:57:53 +0100 Subject: [PATCH] make ddbridge device access count atomic --- ddbridge/ddbridge-core.c | 8 +++++--- ddbridge/ddbridge.h | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/ddbridge/ddbridge-core.c b/ddbridge/ddbridge-core.c index 763046c..64150d2 100644 --- a/ddbridge/ddbridge-core.c +++ b/ddbridge/ddbridge-core.c @@ -3340,7 +3340,7 @@ static int ddb_release(struct inode *inode, struct file *file) { struct ddb *dev = file->private_data; - dev->ddb_dev_users--; + atomic_inc(&dev->ddb_dev_users); return 0; } @@ -3348,9 +3348,10 @@ static int ddb_open(struct inode *inode, struct file *file) { struct ddb *dev = ddbs[iminor(inode)]; - if (dev->ddb_dev_users) + if (!atomic_dec_and_test(&dev->ddb_dev_users)) { + atomic_inc(&dev->ddb_dev_users); return -EBUSY; - dev->ddb_dev_users++; + } file->private_data = dev; return 0; } @@ -4278,6 +4279,7 @@ static int ddb_device_create(struct ddb *dev) return -ENOMEM; mutex_lock(&ddb_mutex); dev->nr = ddb_num; + atomic_set(&dev->ddb_dev_users, 1); ddbs[dev->nr] = dev; dev->ddb_dev = device_create(&ddb_class, dev->dev, MKDEV(ddb_major, dev->nr), diff --git a/ddbridge/ddbridge.h b/ddbridge/ddbridge.h index 2416880..370a2ba 100644 --- a/ddbridge/ddbridge.h +++ b/ddbridge/ddbridge.h @@ -450,7 +450,7 @@ struct ddb { struct ddb_dma odma[DDB_MAX_OUTPUT]; struct device *ddb_dev; - u32 ddb_dev_users; + atomic_t ddb_dev_users; u32 nr; u8 iobuf[1028];