Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
advLigoRTS
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Deploy
Releases
Container Registry
Model registry
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
CDS
software
advLigoRTS
Commits
ca37ba54
Commit
ca37ba54
authored
2 years ago
by
Ezekiel Dohmen
Browse files
Options
Downloads
Patches
Plain Diff
Fixing segfault by using new proc interface
parent
663afbb1
No related branches found
Branches containing commit
No related tags found
Tags containing commit
2 merge requests
!439
RCG 5.0 release fro deb 10
,
!415
Cdsrfm to use new dolphin interface
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/pcie_switch/kmod/cdsrfmswitch_core.c
+63
-34
63 additions, 34 deletions
src/pcie_switch/kmod/cdsrfmswitch_core.c
with
63 additions
and
34 deletions
src/pcie_switch/kmod/cdsrfmswitch_core.c
+
63
−
34
View file @
ca37ba54
...
...
@@ -49,15 +49,32 @@
#define DAEMON_RESP_TIMEOUT_MS 2000
#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
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
//to the three dolphin networks
#define CORNER_ADAPTER_NUM
0
#define CORNER_ADAPTER_NUM
2
#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
#define RFM0_EX_ADDR_INDEX 0
...
...
@@ -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
;
write_addr_tmp
=
(
char
*
)
any_msg
.
as_alloc_resp
->
addrs
[
i
].
write_addr
;
if
(
i
==
CORNER_ADAPTER_NUM
)
{
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
[
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
)
{
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
)
{
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
);
}
else
{
//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
[
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
==
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
);
}
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_write_addrs
[
RFM1_EY_ADDR_INDEX
]
=
(
CDS_IPC_COMMS
*
)(
write_addr_tmp
+
IPC_PCIE_BASE_OFFSET
+
RFM1_OFFSET
);
}
else
RTSLOG_WARN
(
"netlink_test_recv_msg() - Unsupported index %d in response
\n
"
,
i
);
}
}
break
;
...
...
@@ -596,13 +612,17 @@ void finish_dolphin( void )
// ************************************************************************
int
cdsrfm_proc_open
(
struct
inode
*
sp_inode
,
struct
file
*
sp_file
)
{
// ************************************************************************
unsigned
max_msg_sz
=
128
;
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
)
{
RTSLOG_ERROR
(
"counter proc open
\n
"
);
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
],
myactive
[
0
][
0
],
myactive
[
0
][
1
],
myactive
[
0
][
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) {
ssize_t
cdsrfm_proc_read
(
struct
file
*
sp_file
,
char
__user
*
buf
,
size_t
size
,
loff_t
*
offset
)
{
// ************************************************************************
int
ret
;
if
(
message
==
NULL
)
{
RTSLOG_INFO
(
"message was NULL!
\n
"
);
return
0
;
}
int
len
=
strlen
(
message
);
RTSLOG_INFO
(
"strlen(message): %d
\n
"
,
len
);
read_p
=
!
read_p
;
if
(
read_p
)
return
0
;
ret
=
copy_to_user
(
buf
,
message
,
len
);
RTSLOG_INFO
(
"ret: %d
\n
"
,
ret
);
return
len
;
}
...
...
@@ -668,8 +696,8 @@ static int __init lr_switch_init(void)
RTSLOG_ERROR
(
"ERROR! kthread_run
\n
"
);
return
PTR_ERR
(
g_monitor_thread
);
}
// Bind thread to CPU
2
kthread_bind
(
g_monitor_thread
,
2
);
// Bind thread to CPU
8
kthread_bind
(
g_monitor_thread
,
8
);
// Start thread
wake_up_process
(
g_monitor_thread
);
...
...
@@ -699,12 +727,13 @@ static int __init lr_switch_init(void)
rts_isolator_exec
(
6
);
// Setup /proc file to move diag info out to user space for EPICS
fops
.
open
=
cdsrfm_proc_open
;
fops
.
read
=
cdsrfm_proc_read
;
fops
.
release
=
cdsrfm_proc_release
;
//fops.owner = THIS_MODULE;
//fops.open = cdsrfm_proc_open;
//fops.read = cdsrfm_proc_read;
//fops.release = cdsrfm_proc_release;
// 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
"
);
remove_proc_entry
(
ENTRY_NAME
,
NULL
);
return
-
ENOMEM
;
...
...
@@ -720,12 +749,12 @@ static void __exit lr_switch_exit(void)
// ************************************************************************
{
int
ret
;
RTSLOG_
ERROR
(
"Goodbye, cdsrfmswitch is shutting down
\n
"
);
RTSLOG_
INFO
(
"Goodbye, cdsrfmswitch is shutting down
\n
"
);
// Stop the Active Channel monitor thread
ret
=
kthread_stop
(
g_monitor_thread
);
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
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment