All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai] [PATCH] Xenomai recvmsg cmsg patch
@ 2013-08-13 20:24 Manuel Huber
  2013-08-13 20:24 ` [Xenomai] [PATCH] rtdm: Fix msghdr struct (cmsg) in sys_rtdm_recvmsg Manuel Huber
  0 siblings, 1 reply; 5+ messages in thread
From: Manuel Huber @ 2013-08-13 20:24 UTC (permalink / raw)
  To: jan.kiszka; +Cc: xenomai

Current implementation of Xenomai's recvmsg syscall doesn't
handle msghdr fields (msg_control, msg_controllen) correctly. It's
necessary to change msg_controllen to the number of bytes written
to the buffer and fix msg_control if it has been used to point to
the actual starting address of the buffer. This would be necessary
to apply another feature to RTnet that allows to pass timestamps
from the driver to userspace applications easily 
(like SO_TIMESTAMP...). Please apply ;)

Manuel


Manuel Huber (1):
  rtdm: Fix msghdr struct (cmsg) in sys_rtdm_recvmsg

 ksrc/skins/rtdm/syscall.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

-- 
1.8.3



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

* [Xenomai] [PATCH] rtdm: Fix msghdr struct (cmsg) in sys_rtdm_recvmsg
  2013-08-13 20:24 [Xenomai] [PATCH] Xenomai recvmsg cmsg patch Manuel Huber
@ 2013-08-13 20:24 ` Manuel Huber
  2013-08-16 11:08   ` Jan Kiszka
  0 siblings, 1 reply; 5+ messages in thread
From: Manuel Huber @ 2013-08-13 20:24 UTC (permalink / raw)
  To: jan.kiszka; +Cc: xenomai

From: Manuel Huber <Manuel.h87@gmail.com>

Whenever a new control message is put into msg_control buffer
the actual address and the space left is saved to msg_control
and msg_controllen. This allows adding messages as long as
there is enough space left in the user-supplied buffer. Both
fields have to be fixed again before passing them to the user
by copying the original starting address of the buffer to
msg_control and saving the actual amount of bytes written to
the buffer to msg_controllen.

* Explicit use of __xn_put_user rather then __xn_copy_to_user
* Don't write back msg->msg_namelen
---
 ksrc/skins/rtdm/syscall.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/ksrc/skins/rtdm/syscall.c b/ksrc/skins/rtdm/syscall.c
index 0ff5d40..7dd20e3 100644
--- a/ksrc/skins/rtdm/syscall.c
+++ b/ksrc/skins/rtdm/syscall.c
@@ -79,22 +79,31 @@ static int sys_rtdm_recvmsg(struct pt_regs *regs)
 {
 	struct task_struct *p = current;
 	struct msghdr krnl_msg;
+	void *cmsg_control;
+	struct msghdr __user *usr_msg;
 	int ret;
 
-	if (unlikely(!access_wok(__xn_reg_arg2(regs),
+	usr_msg = (void __user *)__xn_reg_arg2(regs);
+
+	if (unlikely(!access_wok((void __user *)usr_msg,
 				 sizeof(krnl_msg)) ||
 		     __xn_copy_from_user(&krnl_msg,
-					 (void __user *)__xn_reg_arg2(regs),
+					 (void __user *)usr_msg,
 					 sizeof(krnl_msg))))
 		return -EFAULT;
 
+	cmsg_control = krnl_msg.msg_control;
+
 	ret = __rt_dev_recvmsg(p, __xn_reg_arg1(regs), &krnl_msg,
 			       __xn_reg_arg3(regs));
 	if (unlikely(ret < 0))
 		return ret;
 
-	if (unlikely(__xn_copy_to_user((void __user *)__xn_reg_arg2(regs),
-				       &krnl_msg, sizeof(krnl_msg))))
+	if (unlikely(__xn_put_user((typeof(krnl_msg.msg_controllen))(
+					   krnl_msg.msg_control - cmsg_control),
+				   (void __user *)&usr_msg->msg_controllen) ||
+		     __xn_put_user(krnl_msg.msg_flags,
+				   (void __user *)&(usr_msg->msg_flags))))
 		return -EFAULT;
 
 	return ret;
-- 
1.8.3



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

* Re: [Xenomai] [PATCH] rtdm: Fix msghdr struct (cmsg) in sys_rtdm_recvmsg
  2013-08-13 20:24 ` [Xenomai] [PATCH] rtdm: Fix msghdr struct (cmsg) in sys_rtdm_recvmsg Manuel Huber
@ 2013-08-16 11:08   ` Jan Kiszka
  2013-08-17 10:41     ` Manuel Huber
  0 siblings, 1 reply; 5+ messages in thread
From: Jan Kiszka @ 2013-08-16 11:08 UTC (permalink / raw)
  To: Manuel Huber; +Cc: xenomai

On 2013-08-13 22:24, Manuel Huber wrote:
> From: Manuel Huber <Manuel.h87@gmail.com>
> 
> Whenever a new control message is put into msg_control buffer
> the actual address and the space left is saved to msg_control
> and msg_controllen. This allows adding messages as long as
> there is enough space left in the user-supplied buffer. Both
> fields have to be fixed again before passing them to the user
> by copying the original starting address of the buffer to
> msg_control and saving the actual amount of bytes written to
> the buffer to msg_controllen.
> 
> * Explicit use of __xn_put_user rather then __xn_copy_to_user
> * Don't write back msg->msg_namelen
> ---
>  ksrc/skins/rtdm/syscall.c | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/ksrc/skins/rtdm/syscall.c b/ksrc/skins/rtdm/syscall.c
> index 0ff5d40..7dd20e3 100644
> --- a/ksrc/skins/rtdm/syscall.c
> +++ b/ksrc/skins/rtdm/syscall.c
> @@ -79,22 +79,31 @@ static int sys_rtdm_recvmsg(struct pt_regs *regs)
>  {
>  	struct task_struct *p = current;
>  	struct msghdr krnl_msg;
> +	void *cmsg_control;
> +	struct msghdr __user *usr_msg;
>  	int ret;
>  
> -	if (unlikely(!access_wok(__xn_reg_arg2(regs),
> +	usr_msg = (void __user *)__xn_reg_arg2(regs);
> +
> +	if (unlikely(!access_wok((void __user *)usr_msg,
>  				 sizeof(krnl_msg)) ||
>  		     __xn_copy_from_user(&krnl_msg,
> -					 (void __user *)__xn_reg_arg2(regs),
> +					 (void __user *)usr_msg,
>  					 sizeof(krnl_msg))))
>  		return -EFAULT;
>  
> +	cmsg_control = krnl_msg.msg_control;
> +
>  	ret = __rt_dev_recvmsg(p, __xn_reg_arg1(regs), &krnl_msg,
>  			       __xn_reg_arg3(regs));
>  	if (unlikely(ret < 0))
>  		return ret;
>  
> -	if (unlikely(__xn_copy_to_user((void __user *)__xn_reg_arg2(regs),
> -				       &krnl_msg, sizeof(krnl_msg))))
> +	if (unlikely(__xn_put_user((typeof(krnl_msg.msg_controllen))(
> +					   krnl_msg.msg_control - cmsg_control),

This still lacks documentation in rtdm_recvmsg_handler_t that
msg_control is supposed to be moved forward by the driver when control
data is written to user space.

Also, you should update existing users of this interface in Xenomai,
i.e. the CAN layer.

> +				   (void __user *)&usr_msg->msg_controllen) ||
> +		     __xn_put_user(krnl_msg.msg_flags,
> +				   (void __user *)&(usr_msg->msg_flags))))
>  		return -EFAULT;
>  
>  	return ret;
> 

Thanks,
Jan

-- 
Siemens AG, Corporate Technology, CT RTC ITP SES-DE
Corporate Competence Center Embedded Linux


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

* Re: [Xenomai] [PATCH] rtdm: Fix msghdr struct (cmsg) in sys_rtdm_recvmsg
  2013-08-16 11:08   ` Jan Kiszka
@ 2013-08-17 10:41     ` Manuel Huber
  2013-08-18  9:20       ` Jan Kiszka
  0 siblings, 1 reply; 5+ messages in thread
From: Manuel Huber @ 2013-08-17 10:41 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai

> This still lacks documentation in rtdm_recvmsg_handler_t that
> msg_control is supposed to be moved forward by the driver when control
> data is written to user space.
Oh, sorry; I forgot to add this....
Is this description okay:?

  @param[in,out] msg Message descriptor as passed by the user, automatically
  mirrored to safe kernel memory in case of user mode call. If msg_control
  points to a valid buffer (not NULL) and msg_controllen is > 0, cmsghdr
  structures can be put into msg_control buffer by driver code. The
  msg_controllen field has to be decremented accordingly to mirror the
  actual space left and msg_control shall be incremented to always point
  to the next free byte.
  If there is insufficient space left, MSG_CTRUNC will be set in msg_flags,
  but the call shall succeed.
  Before returning, the actual number of bytes written to the msg_control
  buffer is written to msg_controllen and msg_control is reset to the 
original
  starting address.

> Also, you should update existing users
> of this interface in Xenomai, i.e. the CAN layer.
Oh, sorry; I just assumed that msg_control has not been used, sorry...
I checked the drivers and I believe it's only rtcan. There are two
ways to fix rtcan:

1) I can break existing user code by using rt_put_cmsg from my RTnet
patch (which does the same as put_cmsg from linux kernel) because
that's how you are supposed to use msg_control buffer (to allow extra
messages from every layer) and rtcan simply writes the timestamp to
the buffer (no cmsghdr structure).

2) I can just fix current rtcan implementation to work with the
proposed patch (fixing msg_controllen and msg_control according to the
protocol in the driver) and not break existing user code but keep
violating the original protocol (by not using cmsghr).

3) 1 + 2: Keep original interface to not break existing user code but
add a warning when activating RTCAN_RTIOC_TAKE_TIMESTAMP (deprecated
interface) and implement another interface that complies to the
protocol and can be used instead (but adds overhead to code compared
to the current interface...).

In case 1, 3 I would also like to move rt_put_cmsg to xenomai and
maybe define SCM_TIMESTAMPNS64 in xenomai and use it in rtcan and
RTnet to simply copy nanosecs_abs_t (by using rt_put_cmsg). As a
legacy option I could implement SO_TIMESTAMPNS interface which
converts nanosecs_abs_t to a timespec struct (as in my RTnet patch
rt_nanosecs_to_ts ()).

I would add SCM_TIMESTAMPNS64 (we can rename that...) to rtdm
header files as a standard option to get timestamps through recvmsg...

But I can't test rtcan (I think...); Is there someone who can? Change
2 is rather simple and should work (without testing) if I'm very
careful. 1 and especially 3 are bigger changes (maybe 20-30 lines),
this must be tested;

I personally like number 3 the most; I would start to implement number
2 send the patch and then start developing number 3.

What do you think?


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

* Re: [Xenomai] [PATCH] rtdm: Fix msghdr struct (cmsg) in sys_rtdm_recvmsg
  2013-08-17 10:41     ` Manuel Huber
@ 2013-08-18  9:20       ` Jan Kiszka
  0 siblings, 0 replies; 5+ messages in thread
From: Jan Kiszka @ 2013-08-18  9:20 UTC (permalink / raw)
  To: Manuel Huber; +Cc: xenomai

On 2013-08-17 12:41, Manuel Huber wrote:
>> This still lacks documentation in rtdm_recvmsg_handler_t that
>> msg_control is supposed to be moved forward by the driver when control
>> data is written to user space.
> Oh, sorry; I forgot to add this....
> Is this description okay:?
> 
>  @param[in,out] msg Message descriptor as passed by the user, automatically
>  mirrored to safe kernel memory in case of user mode call. If msg_control
>  points to a valid buffer (not NULL) and msg_controllen is > 0, cmsghdr
>  structures can be put into msg_control buffer by driver code. The
>  msg_controllen field has to be decremented accordingly to mirror the
>  actual space left and msg_control shall be incremented to always point
>  to the next free byte.

Decrementing msg_controllen is not part of an interface between core and
driver, is it? Let's keep it straight.

>  If there is insufficient space left, MSG_CTRUNC will be set in msg_flags,

Who will set it, core layer or driver?

>  but the call shall succeed.
>  Before returning, the actual number of bytes written to the msg_control
>  buffer is written to msg_controllen and msg_control is reset to the
> original
>  starting address.

That's confusing. Better state that the core layer will update the
user's msg_controllen field according to the number of bytes the driver
reported to have written (via moving msg_control). This implies that the
user's msg_control field is not updated.

> 
>> Also, you should update existing users
>> of this interface in Xenomai, i.e. the CAN layer.
> Oh, sorry; I just assumed that msg_control has not been used, sorry...
> I checked the drivers and I believe it's only rtcan. There are two
> ways to fix rtcan:
> 
> 1) I can break existing user code by using rt_put_cmsg from my RTnet
> patch (which does the same as put_cmsg from linux kernel) because
> that's how you are supposed to use msg_control buffer (to allow extra
> messages from every layer) and rtcan simply writes the timestamp to
> the buffer (no cmsghdr structure).
> 
> 2) I can just fix current rtcan implementation to work with the
> proposed patch (fixing msg_controllen and msg_control according to the
> protocol in the driver) and not break existing user code but keep
> violating the original protocol (by not using cmsghr).
> 
> 3) 1 + 2: Keep original interface to not break existing user code but
> add a warning when activating RTCAN_RTIOC_TAKE_TIMESTAMP (deprecated
> interface) and implement another interface that complies to the
> protocol and can be used instead (but adds overhead to code compared
> to the current interface...).
> 
> In case 1, 3 I would also like to move rt_put_cmsg to xenomai and
> maybe define SCM_TIMESTAMPNS64 in xenomai and use it in rtcan and
> RTnet to simply copy nanosecs_abs_t (by using rt_put_cmsg). As a
> legacy option I could implement SO_TIMESTAMPNS interface which
> converts nanosecs_abs_t to a timespec struct (as in my RTnet patch
> rt_nanosecs_to_ts ()).
> 
> I would add SCM_TIMESTAMPNS64 (we can rename that...) to rtdm
> header files as a standard option to get timestamps through recvmsg...
> 
> But I can't test rtcan (I think...); Is there someone who can? Change
> 2 is rather simple and should work (without testing) if I'm very
> careful. 1 and especially 3 are bigger changes (maybe 20-30 lines),
> this must be tested;
> 
> I personally like number 3 the most; I would start to implement number
> 2 send the patch and then start developing number 3.
> 
> What do you think?

Starting with option 2 sounds reasonable. We can then discuss
introducing a generic timestamp feature that all RTDM protocol drivers
can implement in the same way while keeping the existing ones of RTCAN
and RTnet for backward compatibility.

Regarding CAN testing: You should be able to work with virtual CAN
adapters, they should also produce timestamps. CC'ing Wolfgang to
confirm this.

Jan


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 263 bytes
Desc: OpenPGP digital signature
URL: <http://www.xenomai.org/pipermail/xenomai/attachments/20130818/5e51b835/attachment.pgp>

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

end of thread, other threads:[~2013-08-18  9:20 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-13 20:24 [Xenomai] [PATCH] Xenomai recvmsg cmsg patch Manuel Huber
2013-08-13 20:24 ` [Xenomai] [PATCH] rtdm: Fix msghdr struct (cmsg) in sys_rtdm_recvmsg Manuel Huber
2013-08-16 11:08   ` Jan Kiszka
2013-08-17 10:41     ` Manuel Huber
2013-08-18  9:20       ` Jan Kiszka

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.