s390: Make cpc_name accessible
sclp_ocf.c is the only way to get the cpc name, as it registers the sole event handler for the ocf event. By creating a new global function that copies that name, we make it accessible to the world which longs to retrieve it. Additionally we now also store the cpc name as EBCDIC, so we don't have to convert it to and from ASCII if it is requested in native encoding. Signed-off-by: Janosch Frank <frankja@linux.vnet.ibm.com> Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com> Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
This commit is contained in:
parent
e65f30e0cb
commit
e435dc3139
|
@ -101,5 +101,6 @@ int memcpy_hsa_kernel(void *dest, unsigned long src, size_t count);
|
||||||
int memcpy_hsa_user(void __user *dest, unsigned long src, size_t count);
|
int memcpy_hsa_user(void __user *dest, unsigned long src, size_t count);
|
||||||
void sclp_early_detect(void);
|
void sclp_early_detect(void);
|
||||||
void _sclp_print_early(const char *);
|
void _sclp_print_early(const char *);
|
||||||
|
void sclp_ocf_cpc_name_copy(char *dst);
|
||||||
|
|
||||||
#endif /* _ASM_S390_SCLP_H */
|
#endif /* _ASM_S390_SCLP_H */
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#define OCF_LENGTH_CPC_NAME 8UL
|
#define OCF_LENGTH_CPC_NAME 8UL
|
||||||
|
|
||||||
static char hmc_network[OCF_LENGTH_HMC_NETWORK + 1];
|
static char hmc_network[OCF_LENGTH_HMC_NETWORK + 1];
|
||||||
static char cpc_name[OCF_LENGTH_CPC_NAME + 1];
|
static char cpc_name[OCF_LENGTH_CPC_NAME]; /* in EBCDIC */
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(sclp_ocf_lock);
|
static DEFINE_SPINLOCK(sclp_ocf_lock);
|
||||||
static struct work_struct sclp_ocf_change_work;
|
static struct work_struct sclp_ocf_change_work;
|
||||||
|
@ -72,9 +72,8 @@ static void sclp_ocf_handler(struct evbuf_header *evbuf)
|
||||||
}
|
}
|
||||||
if (cpc) {
|
if (cpc) {
|
||||||
size = min(OCF_LENGTH_CPC_NAME, (size_t) cpc->length);
|
size = min(OCF_LENGTH_CPC_NAME, (size_t) cpc->length);
|
||||||
|
memset(cpc_name, 0, OCF_LENGTH_CPC_NAME);
|
||||||
memcpy(cpc_name, cpc + 1, size);
|
memcpy(cpc_name, cpc + 1, size);
|
||||||
EBCASC(cpc_name, size);
|
|
||||||
cpc_name[size] = 0;
|
|
||||||
}
|
}
|
||||||
spin_unlock(&sclp_ocf_lock);
|
spin_unlock(&sclp_ocf_lock);
|
||||||
schedule_work(&sclp_ocf_change_work);
|
schedule_work(&sclp_ocf_change_work);
|
||||||
|
@ -85,15 +84,23 @@ static struct sclp_register sclp_ocf_event = {
|
||||||
.receiver_fn = sclp_ocf_handler,
|
.receiver_fn = sclp_ocf_handler,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void sclp_ocf_cpc_name_copy(char *dst)
|
||||||
|
{
|
||||||
|
spin_lock_irq(&sclp_ocf_lock);
|
||||||
|
memcpy(dst, cpc_name, OCF_LENGTH_CPC_NAME);
|
||||||
|
spin_unlock_irq(&sclp_ocf_lock);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(sclp_ocf_cpc_name_copy);
|
||||||
|
|
||||||
static ssize_t cpc_name_show(struct kobject *kobj,
|
static ssize_t cpc_name_show(struct kobject *kobj,
|
||||||
struct kobj_attribute *attr, char *page)
|
struct kobj_attribute *attr, char *page)
|
||||||
{
|
{
|
||||||
int rc;
|
char name[OCF_LENGTH_CPC_NAME + 1];
|
||||||
|
|
||||||
spin_lock_irq(&sclp_ocf_lock);
|
sclp_ocf_cpc_name_copy(name);
|
||||||
rc = snprintf(page, PAGE_SIZE, "%s\n", cpc_name);
|
name[OCF_LENGTH_CPC_NAME] = 0;
|
||||||
spin_unlock_irq(&sclp_ocf_lock);
|
EBCASC(name, OCF_LENGTH_CPC_NAME);
|
||||||
return rc;
|
return snprintf(page, PAGE_SIZE, "%s\n", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct kobj_attribute cpc_name_attr =
|
static struct kobj_attribute cpc_name_attr =
|
||||||
|
|
Loading…
Reference in New Issue