Skip to content
Snippets Groups Projects
Commit ca37ba54 authored by Ezekiel Dohmen's avatar Ezekiel Dohmen
Browse files

Fixing segfault by using new proc interface

parent 663afbb1
No related branches found
No related tags found
2 merge requests!439RCG 5.0 release fro deb 10,!415Cdsrfm to use new dolphin interface
...@@ -49,15 +49,32 @@ ...@@ -49,15 +49,32 @@
#define DAEMON_RESP_TIMEOUT_MS 2000 #define DAEMON_RESP_TIMEOUT_MS 2000
#define DAEMON_RESP_CHECK_RATE_MS 30 #define DAEMON_RESP_CHECK_RATE_MS 30
int cdsrfm_proc_open(struct inode *sp_inode,struct file *sp_file);
ssize_t cdsrfm_proc_read(struct file *sp_file, char __user *buf,size_t size,loff_t *offset);
int cdsrfm_proc_release(struct inode *sp_inode,struct file *sp_file);
// struct for using /proc files // struct for using /proc files
static struct file_operations fops; static struct file_operations proc_fops;
static const struct proc_ops proc_fops = {
.proc_open = cdsrfm_proc_open,
.proc_read = cdsrfm_proc_read,
//.proc_lseek = seq_lseek,
.proc_release = cdsrfm_proc_release,
};
//fops.owner = THIS_MODULE;
//fops.open = cdsrfm_proc_open;
//fops.read = cdsrfm_proc_read;
//fops.release = cdsrfm_proc_release;
//These define what dolphin adapters are connected //These define what dolphin adapters are connected
//to the three dolphin networks //to the three dolphin networks
#define CORNER_ADAPTER_NUM 0 #define CORNER_ADAPTER_NUM 2
#define RFM0_EX_ADAPTER_NUM 1 #define RFM0_EX_ADAPTER_NUM 1
#define RFM1_EY_ADAPTER_NUM 2 #define RFM1_EY_ADAPTER_NUM 0
//These map you into the g_dolphin_(read/write)_addrs //These map you into the g_dolphin_(read/write)_addrs
#define RFM0_EX_ADDR_INDEX 0 #define RFM0_EX_ADDR_INDEX 0
...@@ -438,28 +455,27 @@ static void netlink_recv_resp(struct sk_buff *skb) ...@@ -438,28 +455,27 @@ static void netlink_recv_resp(struct sk_buff *skb)
read_addr_tmp = (char*)any_msg.as_alloc_resp->addrs[ i ].read_addr; read_addr_tmp = (char*)any_msg.as_alloc_resp->addrs[ i ].read_addr;
write_addr_tmp = (char*)any_msg.as_alloc_resp->addrs[ i ].write_addr; write_addr_tmp = (char*)any_msg.as_alloc_resp->addrs[ i ].write_addr;
if(i == CORNER_ADAPTER_NUM) //No matter the adapter numbers, g_adapter_map orders them as expected below
{ if(i == g_adapter_map[0])
g_dolphin_read_addrs[RFM0_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET); {
g_dolphin_write_addrs[RFM0_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET); g_dolphin_read_addrs[RFM0_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
g_dolphin_read_addrs[RFM1_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET); g_dolphin_write_addrs[RFM0_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
g_dolphin_write_addrs[RFM1_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET); g_dolphin_read_addrs[RFM1_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
} g_dolphin_write_addrs[RFM1_CS_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
else if (i == RFM0_EX_ADAPTER_NUM) }
{ else if (i == g_adapter_map[1])
g_dolphin_read_addrs[RFM0_EX_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET); {
g_dolphin_write_addrs[RFM0_EX_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET); g_dolphin_read_addrs[RFM0_EX_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
g_dolphin_write_addrs[RFM0_EX_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM0_OFFSET);
} }
else if (i == RFM1_EY_ADAPTER_NUM) else if (i == g_adapter_map[2])
{ {
g_dolphin_read_addrs[RFM1_EY_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET); g_dolphin_read_addrs[RFM1_EY_ADDR_INDEX] = (CDS_IPC_COMMS *)(read_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
g_dolphin_write_addrs[RFM1_EY_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET); g_dolphin_write_addrs[RFM1_EY_ADDR_INDEX] = (CDS_IPC_COMMS *)(write_addr_tmp + IPC_PCIE_BASE_OFFSET + RFM1_OFFSET);
} }
else else
{
RTSLOG_WARN("netlink_test_recv_msg() - Unsupported index %d in response\n", i); RTSLOG_WARN("netlink_test_recv_msg() - Unsupported index %d in response\n", i);
}
} }
break; break;
...@@ -596,13 +612,17 @@ void finish_dolphin( void ) ...@@ -596,13 +612,17 @@ void finish_dolphin( void )
// ************************************************************************ // ************************************************************************
int cdsrfm_proc_open(struct inode *sp_inode,struct file *sp_file) { int cdsrfm_proc_open(struct inode *sp_inode,struct file *sp_file) {
// ************************************************************************ // ************************************************************************
unsigned max_msg_sz = 128;
read_p = 1; read_p = 1;
message = kmalloc(sizeof(char)*128,__GFP_RECLAIM|__GFP_IO|__GFP_FS); message = kmalloc(sizeof(char)*max_msg_sz,__GFP_RECLAIM|__GFP_IO|__GFP_FS);
if(message == NULL) { if(message == NULL) {
RTSLOG_ERROR("counter proc open\n"); RTSLOG_ERROR("counter proc open\n");
return -ENOMEM; return -ENOMEM;
} }
sprintf(message,"%ld %ld %ld %ld %ld %d %d %d %d %d %d %d %d %d %d %d %d %d\n", RTSLOG_INFO("message: %p\n", message);
snprintf(message, max_msg_sz,
"%ld %ld %ld %ld %ld %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
mycounter[0],mycounter[1],mycounter[2],mycounter[3],mycounter[9], mycounter[0],mycounter[1],mycounter[2],mycounter[3],mycounter[9],
myactive[0][0],myactive[0][1],myactive[0][2], myactive[0][0],myactive[0][1],myactive[0][2],
myactive[1][0],myactive[1][1],myactive[1][2], myactive[1][0],myactive[1][1],myactive[1][2],
...@@ -616,10 +636,18 @@ int cdsrfm_proc_open(struct inode *sp_inode,struct file *sp_file) { ...@@ -616,10 +636,18 @@ int cdsrfm_proc_open(struct inode *sp_inode,struct file *sp_file) {
ssize_t cdsrfm_proc_read(struct file *sp_file, char __user *buf,size_t size,loff_t *offset) { ssize_t cdsrfm_proc_read(struct file *sp_file, char __user *buf,size_t size,loff_t *offset) {
// ************************************************************************ // ************************************************************************
int ret; int ret;
if(message == NULL)
{
RTSLOG_INFO("message was NULL!\n");
return 0;
}
int len = strlen(message); int len = strlen(message);
RTSLOG_INFO("strlen(message): %d\n", len);
read_p = !read_p; read_p = !read_p;
if(read_p) return 0; if(read_p) return 0;
ret = copy_to_user(buf,message,len); ret = copy_to_user(buf,message,len);
RTSLOG_INFO("ret: %d\n", ret);
return len; return len;
} }
...@@ -668,8 +696,8 @@ static int __init lr_switch_init(void) ...@@ -668,8 +696,8 @@ static int __init lr_switch_init(void)
RTSLOG_ERROR("ERROR! kthread_run\n"); RTSLOG_ERROR("ERROR! kthread_run\n");
return PTR_ERR(g_monitor_thread); return PTR_ERR(g_monitor_thread);
} }
// Bind thread to CPU 2 // Bind thread to CPU 8
kthread_bind(g_monitor_thread, 2); kthread_bind(g_monitor_thread, 8);
// Start thread // Start thread
wake_up_process(g_monitor_thread); wake_up_process(g_monitor_thread);
...@@ -699,12 +727,13 @@ static int __init lr_switch_init(void) ...@@ -699,12 +727,13 @@ static int __init lr_switch_init(void)
rts_isolator_exec(6); rts_isolator_exec(6);
// Setup /proc file to move diag info out to user space for EPICS // Setup /proc file to move diag info out to user space for EPICS
fops.open = cdsrfm_proc_open; //fops.owner = THIS_MODULE;
fops.read = cdsrfm_proc_read; //fops.open = cdsrfm_proc_open;
fops.release = cdsrfm_proc_release; //fops.read = cdsrfm_proc_read;
//fops.release = cdsrfm_proc_release;
// Create the /proc file // Create the /proc file
if(!proc_create(ENTRY_NAME,PERM,NULL,(void *)&fops)) { if(!proc_create(ENTRY_NAME, PERM, NULL, &proc_fops)) {
RTSLOG_ERROR("ERROR! proc_create\n"); RTSLOG_ERROR("ERROR! proc_create\n");
remove_proc_entry(ENTRY_NAME,NULL); remove_proc_entry(ENTRY_NAME,NULL);
return -ENOMEM; return -ENOMEM;
...@@ -720,12 +749,12 @@ static void __exit lr_switch_exit(void) ...@@ -720,12 +749,12 @@ static void __exit lr_switch_exit(void)
// ************************************************************************ // ************************************************************************
{ {
int ret; int ret;
RTSLOG_ERROR("Goodbye, cdsrfmswitch is shutting down\n"); RTSLOG_INFO("Goodbye, cdsrfmswitch is shutting down\n");
// Stop the Active Channel monitor thread // Stop the Active Channel monitor thread
ret = kthread_stop(g_monitor_thread); ret = kthread_stop(g_monitor_thread);
if (ret != -EINTR) if (ret != -EINTR)
RTSLOG_ERROR("RFM thread has stopped %ld\n", mycounter[1]); RTSLOG_INFO("RFM thread has stopped %ld\n", mycounter[1]);
ssleep(2); ssleep(2);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment