linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v7 5/9] iommu/exynos: change rwlock to spinlock
@ 2013-07-05 12:29 Cho KyongHo
  2013-07-12 15:30 ` Bartlomiej Zolnierkiewicz
  0 siblings, 1 reply; 3+ messages in thread
From: Cho KyongHo @ 2013-07-05 12:29 UTC (permalink / raw)
  To: 'Linux ARM Kernel', 'Linux IOMMU',
	'Linux Kernel', 'Linux Samsung SOC'
  Cc: 'Hyunwoong Kim', 'Joerg Roedel',
	'Kukjin Kim', 'Prathyush', 'Rahul Sharma',
	'Subash Patel', 'Keyyoung Park',
	'Grant Grundler'

Since acquiring read_lock is not more frequent than write_lock, it is
not beneficial to use rwlock, this commit changes rwlock to spinlock.

Signed-off-by: Cho KyongHo <pullip.cho@samsung.com>
---
 drivers/iommu/exynos-iommu.c |   32 ++++++++++++++++----------------
 1 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c
index 390f8b7..6793661 100644
--- a/drivers/iommu/exynos-iommu.c
+++ b/drivers/iommu/exynos-iommu.c
@@ -175,7 +175,7 @@ struct sysmmu_drvdata {
 	void __iomem **sfrbases;
 	struct clk *clk[2];
 	int activations;
-	rwlock_t lock;
+	spinlock_t lock;
 	struct iommu_domain *domain;
 	sysmmu_fault_handler_t fault_handler;
 	unsigned long pgtable;
@@ -259,7 +259,7 @@ void exynos_sysmmu_set_prefbuf(struct device *dev,
 	BUG_ON((base0 + size0) <= base0);
 	BUG_ON((size1 > 0) && ((base1 + size1) <= base1));
 
-	read_lock_irqsave(&data->lock, flags);
+	spin_lock_irqsave(&data->lock, flags);
 	if (!is_sysmmu_active(data))
 		goto finish;
 
@@ -289,7 +289,7 @@ void exynos_sysmmu_set_prefbuf(struct device *dev,
 		}
 	}
 finish:
-	read_unlock_irqrestore(&data->lock, flags);
+	spin_unlock_irqrestore(&data->lock, flags);
 }
 
 static void __set_fault_handler(struct sysmmu_drvdata *data,
@@ -297,9 +297,9 @@ static void __set_fault_handler(struct sysmmu_drvdata *data,
 {
 	unsigned long flags;
 
-	write_lock_irqsave(&data->lock, flags);
+	spin_lock_irqsave(&data->lock, flags);
 	data->fault_handler = handler;
-	write_unlock_irqrestore(&data->lock, flags);
+	spin_unlock_irqrestore(&data->lock, flags);
 }
 
 void exynos_sysmmu_set_fault_handler(struct device *dev,
@@ -347,7 +347,7 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
 
 	int i, ret = -ENOSYS;
 
-	read_lock(&data->lock);
+	spin_lock(&data->lock);
 
 	WARN_ON(!is_sysmmu_active(data));
 
@@ -391,7 +391,7 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
 	if (itype != SYSMMU_FAULT_UNKNOWN)
 		sysmmu_unblock(data->sfrbases[i]);
 
-	read_unlock(&data->lock);
+	spin_unlock(&data->lock);
 
 	return IRQ_HANDLED;
 }
@@ -402,7 +402,7 @@ static bool __exynos_sysmmu_disable(struct sysmmu_drvdata *data)
 	bool disabled = false;
 	int i;
 
-	write_lock_irqsave(&data->lock, flags);
+	spin_lock_irqsave(&data->lock, flags);
 
 	if (!set_sysmmu_inactive(data))
 		goto finish;
@@ -419,7 +419,7 @@ static bool __exynos_sysmmu_disable(struct sysmmu_drvdata *data)
 	data->pgtable = 0;
 	data->domain = NULL;
 finish:
-	write_unlock_irqrestore(&data->lock, flags);
+	spin_unlock_irqrestore(&data->lock, flags);
 
 	if (disabled)
 		dev_dbg(data->sysmmu, "(%s) Disabled\n", data->dbgname);
@@ -442,7 +442,7 @@ static int __exynos_sysmmu_enable(struct sysmmu_drvdata *data,
 	int i, ret = 0;
 	unsigned long flags;
 
-	write_lock_irqsave(&data->lock, flags);
+	spin_lock_irqsave(&data->lock, flags);
 
 	if (!set_sysmmu_active(data)) {
 		if (WARN_ON(pgtable != data->pgtable)) {
@@ -481,7 +481,7 @@ static int __exynos_sysmmu_enable(struct sysmmu_drvdata *data,
 
 	dev_dbg(data->sysmmu, "(%s) Enabled\n", data->dbgname);
 finish:
-	write_unlock_irqrestore(&data->lock, flags);
+	spin_unlock_irqrestore(&data->lock, flags);
 
 	return ret;
 }
@@ -528,7 +528,7 @@ static void sysmmu_tlb_invalidate_entry(struct device *dev, unsigned long iova)
 	unsigned long flags;
 	struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
 
-	read_lock_irqsave(&data->lock, flags);
+	spin_lock_irqsave(&data->lock, flags);
 
 	if (is_sysmmu_active(data)) {
 		int i;
@@ -545,7 +545,7 @@ static void sysmmu_tlb_invalidate_entry(struct device *dev, unsigned long iova)
 			data->dbgname);
 	}
 
-	read_unlock_irqrestore(&data->lock, flags);
+	spin_unlock_irqrestore(&data->lock, flags);
 }
 
 void exynos_sysmmu_tlb_invalidate(struct device *dev)
@@ -553,7 +553,7 @@ void exynos_sysmmu_tlb_invalidate(struct device *dev)
 	unsigned long flags;
 	struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
 
-	read_lock_irqsave(&data->lock, flags);
+	spin_lock_irqsave(&data->lock, flags);
 
 	if (is_sysmmu_active(data)) {
 		int i;
@@ -569,7 +569,7 @@ void exynos_sysmmu_tlb_invalidate(struct device *dev)
 			data->dbgname);
 	}
 
-	read_unlock_irqrestore(&data->lock, flags);
+	spin_unlock_irqrestore(&data->lock, flags);
 }
 
 static int exynos_sysmmu_probe(struct platform_device *pdev)
@@ -666,7 +666,7 @@ static int exynos_sysmmu_probe(struct platform_device *pdev)
 	}
 
 	data->sysmmu = dev;
-	rwlock_init(&data->lock);
+	spin_lock_init(&data->lock);
 	INIT_LIST_HEAD(&data->node);
 
 	__set_fault_handler(data, &default_fault_handler);
-- 
1.7.2.5



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH v7 5/9] iommu/exynos: change rwlock to spinlock
  2013-07-05 12:29 [PATCH v7 5/9] iommu/exynos: change rwlock to spinlock Cho KyongHo
@ 2013-07-12 15:30 ` Bartlomiej Zolnierkiewicz
  2013-07-15 10:20   ` Cho KyongHo
  0 siblings, 1 reply; 3+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2013-07-12 15:30 UTC (permalink / raw)
  To: Cho KyongHo
  Cc: 'Linux ARM Kernel', 'Linux IOMMU',
	'Linux Kernel', 'Linux Samsung SOC',
	'Hyunwoong Kim', 'Joerg Roedel',
	'Kukjin Kim', 'Prathyush', 'Rahul Sharma',
	'Subash Patel', 'Keyyoung Park',
	'Grant Grundler'


Hi,

On Friday, July 05, 2013 09:29:26 PM Cho KyongHo wrote:
> Since acquiring read_lock is not more frequent than write_lock, it is
> not beneficial to use rwlock, this commit changes rwlock to spinlock.

This change is not of a "fix type" and is not required to make the driver
work so it would probably be best to move it to the end of a patch series
(IOW just making it the last patch in the series).

Best regards,
--
Bartlomiej Zolnierkiewicz
Samsung R&D Institute Poland
Samsung Electronics

> Signed-off-by: Cho KyongHo <pullip.cho@samsung.com>
> ---
>  drivers/iommu/exynos-iommu.c |   32 ++++++++++++++++----------------
>  1 files changed, 16 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c
> index 390f8b7..6793661 100644
> --- a/drivers/iommu/exynos-iommu.c
> +++ b/drivers/iommu/exynos-iommu.c
> @@ -175,7 +175,7 @@ struct sysmmu_drvdata {
>  	void __iomem **sfrbases;
>  	struct clk *clk[2];
>  	int activations;
> -	rwlock_t lock;
> +	spinlock_t lock;
>  	struct iommu_domain *domain;
>  	sysmmu_fault_handler_t fault_handler;
>  	unsigned long pgtable;
> @@ -259,7 +259,7 @@ void exynos_sysmmu_set_prefbuf(struct device *dev,
>  	BUG_ON((base0 + size0) <= base0);
>  	BUG_ON((size1 > 0) && ((base1 + size1) <= base1));
>  
> -	read_lock_irqsave(&data->lock, flags);
> +	spin_lock_irqsave(&data->lock, flags);
>  	if (!is_sysmmu_active(data))
>  		goto finish;
>  
> @@ -289,7 +289,7 @@ void exynos_sysmmu_set_prefbuf(struct device *dev,
>  		}
>  	}
>  finish:
> -	read_unlock_irqrestore(&data->lock, flags);
> +	spin_unlock_irqrestore(&data->lock, flags);
>  }
>  
>  static void __set_fault_handler(struct sysmmu_drvdata *data,
> @@ -297,9 +297,9 @@ static void __set_fault_handler(struct sysmmu_drvdata *data,
>  {
>  	unsigned long flags;
>  
> -	write_lock_irqsave(&data->lock, flags);
> +	spin_lock_irqsave(&data->lock, flags);
>  	data->fault_handler = handler;
> -	write_unlock_irqrestore(&data->lock, flags);
> +	spin_unlock_irqrestore(&data->lock, flags);
>  }
>  
>  void exynos_sysmmu_set_fault_handler(struct device *dev,
> @@ -347,7 +347,7 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
>  
>  	int i, ret = -ENOSYS;
>  
> -	read_lock(&data->lock);
> +	spin_lock(&data->lock);
>  
>  	WARN_ON(!is_sysmmu_active(data));
>  
> @@ -391,7 +391,7 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
>  	if (itype != SYSMMU_FAULT_UNKNOWN)
>  		sysmmu_unblock(data->sfrbases[i]);
>  
> -	read_unlock(&data->lock);
> +	spin_unlock(&data->lock);
>  
>  	return IRQ_HANDLED;
>  }
> @@ -402,7 +402,7 @@ static bool __exynos_sysmmu_disable(struct sysmmu_drvdata *data)
>  	bool disabled = false;
>  	int i;
>  
> -	write_lock_irqsave(&data->lock, flags);
> +	spin_lock_irqsave(&data->lock, flags);
>  
>  	if (!set_sysmmu_inactive(data))
>  		goto finish;
> @@ -419,7 +419,7 @@ static bool __exynos_sysmmu_disable(struct sysmmu_drvdata *data)
>  	data->pgtable = 0;
>  	data->domain = NULL;
>  finish:
> -	write_unlock_irqrestore(&data->lock, flags);
> +	spin_unlock_irqrestore(&data->lock, flags);
>  
>  	if (disabled)
>  		dev_dbg(data->sysmmu, "(%s) Disabled\n", data->dbgname);
> @@ -442,7 +442,7 @@ static int __exynos_sysmmu_enable(struct sysmmu_drvdata *data,
>  	int i, ret = 0;
>  	unsigned long flags;
>  
> -	write_lock_irqsave(&data->lock, flags);
> +	spin_lock_irqsave(&data->lock, flags);
>  
>  	if (!set_sysmmu_active(data)) {
>  		if (WARN_ON(pgtable != data->pgtable)) {
> @@ -481,7 +481,7 @@ static int __exynos_sysmmu_enable(struct sysmmu_drvdata *data,
>  
>  	dev_dbg(data->sysmmu, "(%s) Enabled\n", data->dbgname);
>  finish:
> -	write_unlock_irqrestore(&data->lock, flags);
> +	spin_unlock_irqrestore(&data->lock, flags);
>  
>  	return ret;
>  }
> @@ -528,7 +528,7 @@ static void sysmmu_tlb_invalidate_entry(struct device *dev, unsigned long iova)
>  	unsigned long flags;
>  	struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
>  
> -	read_lock_irqsave(&data->lock, flags);
> +	spin_lock_irqsave(&data->lock, flags);
>  
>  	if (is_sysmmu_active(data)) {
>  		int i;
> @@ -545,7 +545,7 @@ static void sysmmu_tlb_invalidate_entry(struct device *dev, unsigned long iova)
>  			data->dbgname);
>  	}
>  
> -	read_unlock_irqrestore(&data->lock, flags);
> +	spin_unlock_irqrestore(&data->lock, flags);
>  }
>  
>  void exynos_sysmmu_tlb_invalidate(struct device *dev)
> @@ -553,7 +553,7 @@ void exynos_sysmmu_tlb_invalidate(struct device *dev)
>  	unsigned long flags;
>  	struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
>  
> -	read_lock_irqsave(&data->lock, flags);
> +	spin_lock_irqsave(&data->lock, flags);
>  
>  	if (is_sysmmu_active(data)) {
>  		int i;
> @@ -569,7 +569,7 @@ void exynos_sysmmu_tlb_invalidate(struct device *dev)
>  			data->dbgname);
>  	}
>  
> -	read_unlock_irqrestore(&data->lock, flags);
> +	spin_unlock_irqrestore(&data->lock, flags);
>  }
>  
>  static int exynos_sysmmu_probe(struct platform_device *pdev)
> @@ -666,7 +666,7 @@ static int exynos_sysmmu_probe(struct platform_device *pdev)
>  	}
>  
>  	data->sysmmu = dev;
> -	rwlock_init(&data->lock);
> +	spin_lock_init(&data->lock);
>  	INIT_LIST_HEAD(&data->node);
>  
>  	__set_fault_handler(data, &default_fault_handler);


^ permalink raw reply	[flat|nested] 3+ messages in thread

* RE: [PATCH v7 5/9] iommu/exynos: change rwlock to spinlock
  2013-07-12 15:30 ` Bartlomiej Zolnierkiewicz
@ 2013-07-15 10:20   ` Cho KyongHo
  0 siblings, 0 replies; 3+ messages in thread
From: Cho KyongHo @ 2013-07-15 10:20 UTC (permalink / raw)
  To: 'Bartlomiej Zolnierkiewicz'
  Cc: 'Linux ARM Kernel', 'Linux IOMMU',
	'Linux Kernel', 'Linux Samsung SOC',
	'Hyunwoong Kim', 'Joerg Roedel',
	'Kukjin Kim', 'Prathyush', 'Rahul Sharma',
	'Subash Patel', 'Keyyoung Park',
	'Grant Grundler'

> From: Bartlomiej Zolnierkiewicz [mailto:b.zolnierkie@samsung.com]
> Sent: Saturday, July 13, 2013 12:31 AM
> 
> Hi,
> 
> On Friday, July 05, 2013 09:29:26 PM Cho KyongHo wrote:
> > Since acquiring read_lock is not more frequent than write_lock, it is
> > not beneficial to use rwlock, this commit changes rwlock to spinlock.
> 
> This change is not of a "fix type" and is not required to make the driver
> work so it would probably be best to move it to the end of a patch series
> (IOW just making it the last patch in the series).
> 

Thank you for advice.
I will do that in the next patchset :)

Cho KyongHo.

> Best regards,
> --
> Bartlomiej Zolnierkiewicz
> Samsung R&D Institute Poland
> Samsung Electronics
> 
> > Signed-off-by: Cho KyongHo <pullip.cho@samsung.com>
> > ---
> >  drivers/iommu/exynos-iommu.c |   32 ++++++++++++++++----------------
> >  1 files changed, 16 insertions(+), 16 deletions(-)
> >
> > diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c
> > index 390f8b7..6793661 100644
> > --- a/drivers/iommu/exynos-iommu.c
> > +++ b/drivers/iommu/exynos-iommu.c
> > @@ -175,7 +175,7 @@ struct sysmmu_drvdata {
> >  	void __iomem **sfrbases;
> >  	struct clk *clk[2];
> >  	int activations;
> > -	rwlock_t lock;
> > +	spinlock_t lock;
> >  	struct iommu_domain *domain;
> >  	sysmmu_fault_handler_t fault_handler;
> >  	unsigned long pgtable;
> > @@ -259,7 +259,7 @@ void exynos_sysmmu_set_prefbuf(struct device *dev,
> >  	BUG_ON((base0 + size0) <= base0);
> >  	BUG_ON((size1 > 0) && ((base1 + size1) <= base1));
> >
> > -	read_lock_irqsave(&data->lock, flags);
> > +	spin_lock_irqsave(&data->lock, flags);
> >  	if (!is_sysmmu_active(data))
> >  		goto finish;
> >
> > @@ -289,7 +289,7 @@ void exynos_sysmmu_set_prefbuf(struct device *dev,
> >  		}
> >  	}
> >  finish:
> > -	read_unlock_irqrestore(&data->lock, flags);
> > +	spin_unlock_irqrestore(&data->lock, flags);
> >  }
> >
> >  static void __set_fault_handler(struct sysmmu_drvdata *data,
> > @@ -297,9 +297,9 @@ static void __set_fault_handler(struct sysmmu_drvdata *data,
> >  {
> >  	unsigned long flags;
> >
> > -	write_lock_irqsave(&data->lock, flags);
> > +	spin_lock_irqsave(&data->lock, flags);
> >  	data->fault_handler = handler;
> > -	write_unlock_irqrestore(&data->lock, flags);
> > +	spin_unlock_irqrestore(&data->lock, flags);
> >  }
> >
> >  void exynos_sysmmu_set_fault_handler(struct device *dev,
> > @@ -347,7 +347,7 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
> >
> >  	int i, ret = -ENOSYS;
> >
> > -	read_lock(&data->lock);
> > +	spin_lock(&data->lock);
> >
> >  	WARN_ON(!is_sysmmu_active(data));
> >
> > @@ -391,7 +391,7 @@ static irqreturn_t exynos_sysmmu_irq(int irq, void *dev_id)
> >  	if (itype != SYSMMU_FAULT_UNKNOWN)
> >  		sysmmu_unblock(data->sfrbases[i]);
> >
> > -	read_unlock(&data->lock);
> > +	spin_unlock(&data->lock);
> >
> >  	return IRQ_HANDLED;
> >  }
> > @@ -402,7 +402,7 @@ static bool __exynos_sysmmu_disable(struct sysmmu_drvdata *data)
> >  	bool disabled = false;
> >  	int i;
> >
> > -	write_lock_irqsave(&data->lock, flags);
> > +	spin_lock_irqsave(&data->lock, flags);
> >
> >  	if (!set_sysmmu_inactive(data))
> >  		goto finish;
> > @@ -419,7 +419,7 @@ static bool __exynos_sysmmu_disable(struct sysmmu_drvdata *data)
> >  	data->pgtable = 0;
> >  	data->domain = NULL;
> >  finish:
> > -	write_unlock_irqrestore(&data->lock, flags);
> > +	spin_unlock_irqrestore(&data->lock, flags);
> >
> >  	if (disabled)
> >  		dev_dbg(data->sysmmu, "(%s) Disabled\n", data->dbgname);
> > @@ -442,7 +442,7 @@ static int __exynos_sysmmu_enable(struct sysmmu_drvdata *data,
> >  	int i, ret = 0;
> >  	unsigned long flags;
> >
> > -	write_lock_irqsave(&data->lock, flags);
> > +	spin_lock_irqsave(&data->lock, flags);
> >
> >  	if (!set_sysmmu_active(data)) {
> >  		if (WARN_ON(pgtable != data->pgtable)) {
> > @@ -481,7 +481,7 @@ static int __exynos_sysmmu_enable(struct sysmmu_drvdata *data,
> >
> >  	dev_dbg(data->sysmmu, "(%s) Enabled\n", data->dbgname);
> >  finish:
> > -	write_unlock_irqrestore(&data->lock, flags);
> > +	spin_unlock_irqrestore(&data->lock, flags);
> >
> >  	return ret;
> >  }
> > @@ -528,7 +528,7 @@ static void sysmmu_tlb_invalidate_entry(struct device *dev, unsigned long iova)
> >  	unsigned long flags;
> >  	struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
> >
> > -	read_lock_irqsave(&data->lock, flags);
> > +	spin_lock_irqsave(&data->lock, flags);
> >
> >  	if (is_sysmmu_active(data)) {
> >  		int i;
> > @@ -545,7 +545,7 @@ static void sysmmu_tlb_invalidate_entry(struct device *dev, unsigned long iova)
> >  			data->dbgname);
> >  	}
> >
> > -	read_unlock_irqrestore(&data->lock, flags);
> > +	spin_unlock_irqrestore(&data->lock, flags);
> >  }
> >
> >  void exynos_sysmmu_tlb_invalidate(struct device *dev)
> > @@ -553,7 +553,7 @@ void exynos_sysmmu_tlb_invalidate(struct device *dev)
> >  	unsigned long flags;
> >  	struct sysmmu_drvdata *data = dev_get_drvdata(dev->archdata.iommu);
> >
> > -	read_lock_irqsave(&data->lock, flags);
> > +	spin_lock_irqsave(&data->lock, flags);
> >
> >  	if (is_sysmmu_active(data)) {
> >  		int i;
> > @@ -569,7 +569,7 @@ void exynos_sysmmu_tlb_invalidate(struct device *dev)
> >  			data->dbgname);
> >  	}
> >
> > -	read_unlock_irqrestore(&data->lock, flags);
> > +	spin_unlock_irqrestore(&data->lock, flags);
> >  }
> >
> >  static int exynos_sysmmu_probe(struct platform_device *pdev)
> > @@ -666,7 +666,7 @@ static int exynos_sysmmu_probe(struct platform_device *pdev)
> >  	}
> >
> >  	data->sysmmu = dev;
> > -	rwlock_init(&data->lock);
> > +	spin_lock_init(&data->lock);
> >  	INIT_LIST_HEAD(&data->node);
> >
> >  	__set_fault_handler(data, &default_fault_handler);


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2013-07-15 10:20 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-05 12:29 [PATCH v7 5/9] iommu/exynos: change rwlock to spinlock Cho KyongHo
2013-07-12 15:30 ` Bartlomiej Zolnierkiewicz
2013-07-15 10:20   ` Cho KyongHo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).