Commit 7b4ff87c authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

s390/cio: use basic blocks for cmf inline assemblies

Use only simple inline assemblies which consist of a single basic
block if the register asm construct is being used.

Otherwise gcc would generate broken code if the compiler option
--sanitize-coverage=trace-pc would be used.
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Acked-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 7b411ac6
...@@ -164,6 +164,9 @@ static inline u64 time_to_avg_nsec(u32 value, u32 count) ...@@ -164,6 +164,9 @@ static inline u64 time_to_avg_nsec(u32 value, u32 count)
return ret; return ret;
} }
#define CMF_OFF 0
#define CMF_ON 2
/* /*
* Activate or deactivate the channel monitor. When area is NULL, * Activate or deactivate the channel monitor. When area is NULL,
* the monitor is deactivated. The channel monitor needs to * the monitor is deactivated. The channel monitor needs to
...@@ -176,7 +179,7 @@ static inline void cmf_activate(void *area, unsigned int onoff) ...@@ -176,7 +179,7 @@ static inline void cmf_activate(void *area, unsigned int onoff)
register long __gpr1 asm("1"); register long __gpr1 asm("1");
__gpr2 = area; __gpr2 = area;
__gpr1 = onoff ? 2 : 0; __gpr1 = onoff;
/* activate channel measurement */ /* activate channel measurement */
asm("schm" : : "d" (__gpr2), "d" (__gpr1) ); asm("schm" : : "d" (__gpr2), "d" (__gpr1) );
} }
...@@ -587,7 +590,7 @@ static int alloc_cmb(struct ccw_device *cdev) ...@@ -587,7 +590,7 @@ static int alloc_cmb(struct ccw_device *cdev)
/* everything ok */ /* everything ok */
memset(mem, 0, size); memset(mem, 0, size);
cmb_area.mem = mem; cmb_area.mem = mem;
cmf_activate(cmb_area.mem, 1); cmf_activate(cmb_area.mem, CMF_ON);
} }
} }
...@@ -621,7 +624,7 @@ static void free_cmb(struct ccw_device *cdev) ...@@ -621,7 +624,7 @@ static void free_cmb(struct ccw_device *cdev)
if (list_empty(&cmb_area.list)) { if (list_empty(&cmb_area.list)) {
ssize_t size; ssize_t size;
size = sizeof(struct cmb) * cmb_area.num_channels; size = sizeof(struct cmb) * cmb_area.num_channels;
cmf_activate(NULL, 0); cmf_activate(NULL, CMF_OFF);
free_pages((unsigned long)cmb_area.mem, get_order(size)); free_pages((unsigned long)cmb_area.mem, get_order(size));
cmb_area.mem = NULL; cmb_area.mem = NULL;
} }
...@@ -830,7 +833,7 @@ static int alloc_cmbe(struct ccw_device *cdev) ...@@ -830,7 +833,7 @@ static int alloc_cmbe(struct ccw_device *cdev)
/* activate global measurement if this is the first channel */ /* activate global measurement if this is the first channel */
if (list_empty(&cmb_area.list)) if (list_empty(&cmb_area.list))
cmf_activate(NULL, 1); cmf_activate(NULL, CMF_ON);
list_add_tail(&cdev->private->cmb_list, &cmb_area.list); list_add_tail(&cdev->private->cmb_list, &cmb_area.list);
spin_unlock_irq(cdev->ccwlock); spin_unlock_irq(cdev->ccwlock);
...@@ -867,7 +870,7 @@ static void free_cmbe(struct ccw_device *cdev) ...@@ -867,7 +870,7 @@ static void free_cmbe(struct ccw_device *cdev)
/* deactivate global measurement if this is the last channel */ /* deactivate global measurement if this is the last channel */
list_del_init(&cdev->private->cmb_list); list_del_init(&cdev->private->cmb_list);
if (list_empty(&cmb_area.list)) if (list_empty(&cmb_area.list))
cmf_activate(NULL, 0); cmf_activate(NULL, CMF_OFF);
spin_unlock_irq(cdev->ccwlock); spin_unlock_irq(cdev->ccwlock);
spin_unlock(&cmb_area.lock); spin_unlock(&cmb_area.lock);
} }
...@@ -1321,7 +1324,7 @@ void cmf_reactivate(void) ...@@ -1321,7 +1324,7 @@ void cmf_reactivate(void)
{ {
spin_lock(&cmb_area.lock); spin_lock(&cmb_area.lock);
if (!list_empty(&cmb_area.list)) if (!list_empty(&cmb_area.list))
cmf_activate(cmb_area.mem, 1); cmf_activate(cmb_area.mem, CMF_ON);
spin_unlock(&cmb_area.lock); spin_unlock(&cmb_area.lock);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment