All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-core] iovec overwriting by CAN stack
@ 2007-03-30  0:59 Jan Kiszka
  2007-03-30  6:44 ` [Xenomai-core] " Wolfgang Grandegger
  0 siblings, 1 reply; 11+ messages in thread
From: Jan Kiszka @ 2007-03-30  0:59 UTC (permalink / raw)
  To: Wolfgang Grandegger; +Cc: xenomai-core

[-- Attachment #1: Type: text/plain, Size: 480 bytes --]

Hi Wolfgang,

it's late, so I may have misread somecode, but don't you "update" the
iovec descriptors a user passes on send/recvmsg on return (namely
iovec_len)? I received some complaints about this /wrt to in-kernel CAN
stack usage.

I always considered the same well-know behaviour of RTnet a bug, but now
I found your code is doing this systematically, also for user space
callers. Is this behaviour undefined or even required according POSIX or
whatever?

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 250 bytes --]

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

* [Xenomai-core] Re: iovec overwriting by CAN stack
  2007-03-30  0:59 [Xenomai-core] iovec overwriting by CAN stack Jan Kiszka
@ 2007-03-30  6:44 ` Wolfgang Grandegger
  2007-03-30  6:50   ` Jan Kiszka
  0 siblings, 1 reply; 11+ messages in thread
From: Wolfgang Grandegger @ 2007-03-30  6:44 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Jan Kiszka wrote:
> Hi Wolfgang,
> 
> it's late, so I may have misread somecode, but don't you "update" the
> iovec descriptors a user passes on send/recvmsg on return (namely
> iovec_len)? I received some complaints about this /wrt to in-kernel CAN
> stack usage.

It's done here:

http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtcan_raw.c?v=SVN-trunk#881
http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtcan_raw.c?v=SVN-trunk#734

I may have missed something. What are the real complaints? Is there a 
test program?

> I always considered the same well-know behaviour of RTnet a bug, but now
> I found your code is doing this systematically, also for user space
> callers. Is this behaviour undefined or even required according POSIX or
> whatever?

I don't know, it's Sebastian's Kode.

Wolfgang.



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

* [Xenomai-core] Re: iovec overwriting by CAN stack
  2007-03-30  6:44 ` [Xenomai-core] " Wolfgang Grandegger
@ 2007-03-30  6:50   ` Jan Kiszka
  2007-03-30 12:18     ` Sebastian Smolorz
  0 siblings, 1 reply; 11+ messages in thread
From: Jan Kiszka @ 2007-03-30  6:50 UTC (permalink / raw)
  To: Wolfgang Grandegger; +Cc: xenomai-core

[-- Attachment #1: Type: text/plain, Size: 1141 bytes --]

Wolfgang Grandegger wrote:
> Jan Kiszka wrote:
>> Hi Wolfgang,
>>
>> it's late, so I may have misread somecode, but don't you "update" the
>> iovec descriptors a user passes on send/recvmsg on return (namely
>> iovec_len)? I received some complaints about this /wrt to in-kernel CAN
>> stack usage.
> 
> It's done here:
> 
> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtcan_raw.c?v=SVN-trunk#881
> 
> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtcan_raw.c?v=SVN-trunk#734
> 
> 
> I may have missed something. What are the real complaints? Is there a
> test program?

Not yet (will commit the related patch to our RACK likely later today).
It's simply sending frames while re-using the msg+iovec structs in a loop.

> 
>> I always considered the same well-know behaviour of RTnet a bug, but now
>> I found your code is doing this systematically, also for user space
>> callers. Is this behaviour undefined or even required according POSIX or
>> whatever?
> 
> I don't know, it's Sebastian's Kode.
> 

Hmm, hope he will not say that he imitated RTnet...

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 250 bytes --]

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

* [Xenomai-core] Re: iovec overwriting by CAN stack
  2007-03-30  6:50   ` Jan Kiszka
@ 2007-03-30 12:18     ` Sebastian Smolorz
  2007-03-30 12:27       ` Jan Kiszka
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Smolorz @ 2007-03-30 12:18 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Jan Kiszka wrote:
> Wolfgang Grandegger wrote:
> > Jan Kiszka wrote:
> >> Hi Wolfgang,
> >>
> >> it's late, so I may have misread somecode, but don't you "update" the
> >> iovec descriptors a user passes on send/recvmsg on return (namely
> >> iovec_len)? I received some complaints about this /wrt to in-kernel CAN
> >> stack usage.
> >
> > It's done here:
> >
> > http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtcan_
> >raw.c?v=SVN-trunk#881
> >
> > http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtcan_
> >raw.c?v=SVN-trunk#734
> >
> >
> > I may have missed something. What are the real complaints? Is there a
> > test program?
>
> Not yet (will commit the related patch to our RACK likely later today).
> It's simply sending frames while re-using the msg+iovec structs in a loop.
>
> >> I always considered the same well-know behaviour of RTnet a bug, but now
> >> I found your code is doing this systematically, also for user space
> >> callers. Is this behaviour undefined or even required according POSIX or
> >> whatever?
> >
> > I don't know, it's Sebastian's Kode.
>
> Hmm, hope he will not say that he imitated RTnet...

Rather an imitation of the Linux kernel's behaviour. The memcpy_toiovec() and 
memcpy_fromiovec() functions [1] also modify the original iovec. 


[1] http://lxr.free-electrons.com/source/net/core/iovec.c

-- 
Sebastian


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

* [Xenomai-core] Re: iovec overwriting by CAN stack
  2007-03-30 12:18     ` Sebastian Smolorz
@ 2007-03-30 12:27       ` Jan Kiszka
  2007-03-30 13:06         ` Sebastian Smolorz
  0 siblings, 1 reply; 11+ messages in thread
From: Jan Kiszka @ 2007-03-30 12:27 UTC (permalink / raw)
  To: Sebastian Smolorz; +Cc: xenomai-core

[-- Attachment #1: Type: text/plain, Size: 1564 bytes --]

Sebastian Smolorz wrote:
> Jan Kiszka wrote:
>> Wolfgang Grandegger wrote:
>>> Jan Kiszka wrote:
>>>> Hi Wolfgang,
>>>>
>>>> it's late, so I may have misread somecode, but don't you "update" the
>>>> iovec descriptors a user passes on send/recvmsg on return (namely
>>>> iovec_len)? I received some complaints about this /wrt to in-kernel CAN
>>>> stack usage.
>>> It's done here:
>>>
>>> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtcan_
>>> raw.c?v=SVN-trunk#881
>>>
>>> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtcan_
>>> raw.c?v=SVN-trunk#734
>>>
>>>
>>> I may have missed something. What are the real complaints? Is there a
>>> test program?
>> Not yet (will commit the related patch to our RACK likely later today).
>> It's simply sending frames while re-using the msg+iovec structs in a loop.
>>
>>>> I always considered the same well-know behaviour of RTnet a bug, but now
>>>> I found your code is doing this systematically, also for user space
>>>> callers. Is this behaviour undefined or even required according POSIX or
>>>> whatever?
>>> I don't know, it's Sebastian's Kode.
>> Hmm, hope he will not say that he imitated RTnet...
> 
> Rather an imitation of the Linux kernel's behaviour. The memcpy_toiovec() and 
> memcpy_fromiovec() functions [1] also modify the original iovec. 
> 
> 
> [1] http://lxr.free-electrons.com/source/net/core/iovec.c
> 

But that's the kernel's private (and user-safe) copy. I failed to find
it writing that back to user space.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 250 bytes --]

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

* [Xenomai-core] Re: iovec overwriting by CAN stack
  2007-03-30 12:27       ` Jan Kiszka
@ 2007-03-30 13:06         ` Sebastian Smolorz
  2007-03-30 14:17           ` Jan Kiszka
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Smolorz @ 2007-03-30 13:06 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Jan Kiszka wrote:
> Sebastian Smolorz wrote:
> > Jan Kiszka wrote:
> >> Wolfgang Grandegger wrote:
> >>> Jan Kiszka wrote:
> >>>> Hi Wolfgang,
> >>>>
> >>>> it's late, so I may have misread somecode, but don't you "update" the
> >>>> iovec descriptors a user passes on send/recvmsg on return (namely
> >>>> iovec_len)? I received some complaints about this /wrt to in-kernel
> >>>> CAN stack usage.
> >>>
> >>> It's done here:
> >>>
> >>> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtca
> >>>n_ raw.c?v=SVN-trunk#881
> >>>
> >>> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtca
> >>>n_ raw.c?v=SVN-trunk#734
> >>>
> >>>
> >>> I may have missed something. What are the real complaints? Is there a
> >>> test program?
> >>
> >> Not yet (will commit the related patch to our RACK likely later today).
> >> It's simply sending frames while re-using the msg+iovec structs in a
> >> loop.
> >>
> >>>> I always considered the same well-know behaviour of RTnet a bug, but
> >>>> now I found your code is doing this systematically, also for user
> >>>> space callers. Is this behaviour undefined or even required according
> >>>> POSIX or whatever?
> >>>
> >>> I don't know, it's Sebastian's Kode.
> >>
> >> Hmm, hope he will not say that he imitated RTnet...
> >
> > Rather an imitation of the Linux kernel's behaviour. The memcpy_toiovec()
> > and memcpy_fromiovec() functions [1] also modify the original iovec.
> >
> >
> > [1] http://lxr.free-electrons.com/source/net/core/iovec.c
>
> But that's the kernel's private (and user-safe) copy. I failed to find
> it writing that back to user space.

Hm. Ad hoc, I don't recall why the userspace's iovec is also updated. Perhaps 
my intention was to make the use of rtcan_raw_sendmsg consistent for kernel 
and userspace RT-Tasks so that both can rely on finding modified iovecs after 
calling sendmsg/recvmsg. But I'm not absolutely sure if there isn't a better 
explanation for this. I will try to find the reason in my backup memory. ;-)

-- 
Sebastian


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

* [Xenomai-core] Re: iovec overwriting by CAN stack
  2007-03-30 13:06         ` Sebastian Smolorz
@ 2007-03-30 14:17           ` Jan Kiszka
  2007-04-02  8:09             ` Sebastian Smolorz
  0 siblings, 1 reply; 11+ messages in thread
From: Jan Kiszka @ 2007-03-30 14:17 UTC (permalink / raw)
  To: Sebastian Smolorz; +Cc: xenomai-core

[-- Attachment #1: Type: text/plain, Size: 2855 bytes --]

Sebastian Smolorz wrote:
> Jan Kiszka wrote:
>> Sebastian Smolorz wrote:
>>> Jan Kiszka wrote:
>>>> Wolfgang Grandegger wrote:
>>>>> Jan Kiszka wrote:
>>>>>> Hi Wolfgang,
>>>>>>
>>>>>> it's late, so I may have misread somecode, but don't you "update" the
>>>>>> iovec descriptors a user passes on send/recvmsg on return (namely
>>>>>> iovec_len)? I received some complaints about this /wrt to in-kernel
>>>>>> CAN stack usage.
>>>>> It's done here:
>>>>>
>>>>> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtca
>>>>> n_ raw.c?v=SVN-trunk#881
>>>>>
>>>>> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rtca
>>>>> n_ raw.c?v=SVN-trunk#734
>>>>>
>>>>>
>>>>> I may have missed something. What are the real complaints? Is there a
>>>>> test program?
>>>> Not yet (will commit the related patch to our RACK likely later today).
>>>> It's simply sending frames while re-using the msg+iovec structs in a
>>>> loop.
>>>>
>>>>>> I always considered the same well-know behaviour of RTnet a bug, but
>>>>>> now I found your code is doing this systematically, also for user
>>>>>> space callers. Is this behaviour undefined or even required according
>>>>>> POSIX or whatever?
>>>>> I don't know, it's Sebastian's Kode.
>>>> Hmm, hope he will not say that he imitated RTnet...
>>> Rather an imitation of the Linux kernel's behaviour. The memcpy_toiovec()
>>> and memcpy_fromiovec() functions [1] also modify the original iovec.
>>>
>>>
>>> [1] http://lxr.free-electrons.com/source/net/core/iovec.c
>> But that's the kernel's private (and user-safe) copy. I failed to find
>> it writing that back to user space.
> 
> Hm. Ad hoc, I don't recall why the userspace's iovec is also updated. Perhaps 
> my intention was to make the use of rtcan_raw_sendmsg consistent for kernel 
> and userspace RT-Tasks so that both can rely on finding modified iovecs after 
> calling sendmsg/recvmsg. But I'm not absolutely sure if there isn't a better 
> explanation for this. I will try to find the reason in my backup memory. ;-)
> 

So, unless we find some reason why we _must_ modify user's iovec, either
for send or receive, I would say: kill the user copy-back and work in
both case (kernel / user space caller) on the local copy of iovec (if we
still need to modify it all then).

Jan


PS: I just committed this fix (only a problem for in-kernel usage)

--- ksrc/drivers/can/rtcan_raw.c        (Revision 2340)
+++ ksrc/drivers/can/rtcan_raw.c        (Arbeitskopie)
@@ -334,7 +334,7 @@ static int rtcan_raw_setsockopt(struct r
                    return -EFAULT;
                }
            } else
-               memcpy(flist, so->optval, so->optlen);
+               memcpy(flist->flist, so->optval, so->optlen);
            flist->flistlen = flistlen;
        }


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 250 bytes --]

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

* [Xenomai-core] Re: iovec overwriting by CAN stack
  2007-03-30 14:17           ` Jan Kiszka
@ 2007-04-02  8:09             ` Sebastian Smolorz
  2007-04-05 17:30               ` Jan Kiszka
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Smolorz @ 2007-04-02  8:09 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

[-- Attachment #1: Type: text/plain, Size: 2588 bytes --]

Jan Kiszka wrote:
> Sebastian Smolorz wrote:
> > Jan Kiszka wrote:
> >> Sebastian Smolorz wrote:
> >>> Jan Kiszka wrote:
> >>>> Wolfgang Grandegger wrote:
> >>>>> Jan Kiszka wrote:
> >>>>>> Hi Wolfgang,
> >>>>>>
> >>>>>> it's late, so I may have misread somecode, but don't you "update"
> >>>>>> the iovec descriptors a user passes on send/recvmsg on return
> >>>>>> (namely iovec_len)? I received some complaints about this /wrt to
> >>>>>> in-kernel CAN stack usage.
> >>>>>
> >>>>> It's done here:
> >>>>>
> >>>>> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rt
> >>>>>ca n_ raw.c?v=SVN-trunk#881
> >>>>>
> >>>>> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rt
> >>>>>ca n_ raw.c?v=SVN-trunk#734
> >>>>>
> >>>>>
> >>>>> I may have missed something. What are the real complaints? Is there a
> >>>>> test program?
> >>>>
> >>>> Not yet (will commit the related patch to our RACK likely later
> >>>> today). It's simply sending frames while re-using the msg+iovec
> >>>> structs in a loop.
> >>>>
> >>>>>> I always considered the same well-know behaviour of RTnet a bug, but
> >>>>>> now I found your code is doing this systematically, also for user
> >>>>>> space callers. Is this behaviour undefined or even required
> >>>>>> according POSIX or whatever?
> >>>>>
> >>>>> I don't know, it's Sebastian's Kode.
> >>>>
> >>>> Hmm, hope he will not say that he imitated RTnet...
> >>>
> >>> Rather an imitation of the Linux kernel's behaviour. The
> >>> memcpy_toiovec() and memcpy_fromiovec() functions [1] also modify the
> >>> original iovec.
> >>>
> >>>
> >>> [1] http://lxr.free-electrons.com/source/net/core/iovec.c
> >>
> >> But that's the kernel's private (and user-safe) copy. I failed to find
> >> it writing that back to user space.
> >
> > Hm. Ad hoc, I don't recall why the userspace's iovec is also updated.
> > Perhaps my intention was to make the use of rtcan_raw_sendmsg consistent
> > for kernel and userspace RT-Tasks so that both can rely on finding
> > modified iovecs after calling sendmsg/recvmsg. But I'm not absolutely
> > sure if there isn't a better explanation for this. I will try to find the
> > reason in my backup memory. ;-)
>
> So, unless we find some reason why we _must_ modify user's iovec, either
> for send or receive, I would say: kill the user copy-back and work in
> both case (kernel / user space caller) on the local copy of iovec (if we
> still need to modify it all then).

Attached is a patch which leaves the caller's iovec unmodified. It compiles 
successfully (not tested further).

-- 
Sebastian

[-- Attachment #2: rtcan_iovec.patch --]
[-- Type: text/x-diff, Size: 2135 bytes --]

Index: ChangeLog
===================================================================
--- ChangeLog	(Revision 2348)
+++ ChangeLog	(Arbeitskopie)
@@ -1,3 +1,8 @@
+2007-04-02  Sebastian Smolorz <ssm@domain.hid>
+
+	* ksrc/drivers/can/rtcan_raw.c (rtcan_raw_recvmsg, rtcan_raw_sendmsg):
+	Remove modification of caller's original iovec.
+
 2007-03-31  Philippe Gerum  <rpm@xenomai.org>
 
 	* include/nucleus/queue.h (moveq): Fix source tail pointer.
Index: ksrc/drivers/can/rtcan_raw.c
===================================================================
--- ksrc/drivers/can/rtcan_raw.c	(Revision 2348)
+++ ksrc/drivers/can/rtcan_raw.c	(Arbeitskopie)
@@ -731,13 +731,6 @@ ssize_t rtcan_raw_recvmsg(struct rtdm_de
         if (rtdm_copy_to_user(user_info, iov->iov_base, &frame,
 			      sizeof(can_frame_t)))
             return -EFAULT;
-        /* Adjust iovec in the common way */
-        iov->iov_base += sizeof(can_frame_t);
-        iov->iov_len -= sizeof(can_frame_t);
-        /* ... and copy it, too. */
-        if (rtdm_copy_to_user(user_info, msg->msg_iov, iov,
-			      sizeof(struct iovec)))
-            return -EFAULT;
 
         /* Copy timestamp if existent and wanted */
         if (msg->msg_controllen) {
@@ -762,9 +755,6 @@ ssize_t rtcan_raw_recvmsg(struct rtdm_de
 
         /* Copy CAN frame */
         memcpy(iov->iov_base, &frame, sizeof(can_frame_t));
-        /* Adjust iovec in the common way */
-        iov->iov_base += sizeof(can_frame_t);
-        iov->iov_len -= sizeof(can_frame_t);
 
         /* Copy timestamp if existent and wanted */
         if (msg->msg_controllen) {
@@ -878,16 +868,6 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_de
         frame = &frame_buf;
     }
 
-    /* Adjust iovec in the common way */
-    iov->iov_base += sizeof(can_frame_t);
-    iov->iov_len -= sizeof(can_frame_t);
-    /* ... and copy it back to userspace if necessary */
-    if (user_info) {
-        if (rtdm_copy_to_user(user_info, msg->msg_iov, iov,
-			      sizeof(struct iovec)))
-            return -EFAULT;
-    }
-
     /* At last, we've got the frame ... */
 
     /* Check if DLC between 0 and 15 */

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

* [Xenomai-core] Re: iovec overwriting by CAN stack
  2007-04-02  8:09             ` Sebastian Smolorz
@ 2007-04-05 17:30               ` Jan Kiszka
  2007-04-10  7:37                 ` [Xenomai-core] " Sebastian Smolorz
  0 siblings, 1 reply; 11+ messages in thread
From: Jan Kiszka @ 2007-04-05 17:30 UTC (permalink / raw)
  To: Sebastian Smolorz; +Cc: xenomai-core

[-- Attachment #1: Type: text/plain, Size: 5309 bytes --]

Sebastian Smolorz wrote:
> Jan Kiszka wrote:
>> Sebastian Smolorz wrote:
>>> Jan Kiszka wrote:
>>>> Sebastian Smolorz wrote:
>>>>> Jan Kiszka wrote:
>>>>>> Wolfgang Grandegger wrote:
>>>>>>> Jan Kiszka wrote:
>>>>>>>> Hi Wolfgang,
>>>>>>>>
>>>>>>>> it's late, so I may have misread somecode, but don't you "update"
>>>>>>>> the iovec descriptors a user passes on send/recvmsg on return
>>>>>>>> (namely iovec_len)? I received some complaints about this /wrt to
>>>>>>>> in-kernel CAN stack usage.
>>>>>>> It's done here:
>>>>>>>
>>>>>>> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rt
>>>>>>> ca n_ raw.c?v=SVN-trunk#881
>>>>>>>
>>>>>>> http://www.rts.uni-hannover.de/xenomai/lxr/source/ksrc/drivers/can/rt
>>>>>>> ca n_ raw.c?v=SVN-trunk#734
>>>>>>>
>>>>>>>
>>>>>>> I may have missed something. What are the real complaints? Is there a
>>>>>>> test program?
>>>>>> Not yet (will commit the related patch to our RACK likely later
>>>>>> today). It's simply sending frames while re-using the msg+iovec
>>>>>> structs in a loop.
>>>>>>
>>>>>>>> I always considered the same well-know behaviour of RTnet a bug, but
>>>>>>>> now I found your code is doing this systematically, also for user
>>>>>>>> space callers. Is this behaviour undefined or even required
>>>>>>>> according POSIX or whatever?
>>>>>>> I don't know, it's Sebastian's Kode.
>>>>>> Hmm, hope he will not say that he imitated RTnet...
>>>>> Rather an imitation of the Linux kernel's behaviour. The
>>>>> memcpy_toiovec() and memcpy_fromiovec() functions [1] also modify the
>>>>> original iovec.
>>>>>
>>>>>
>>>>> [1] http://lxr.free-electrons.com/source/net/core/iovec.c
>>>> But that's the kernel's private (and user-safe) copy. I failed to find
>>>> it writing that back to user space.
>>> Hm. Ad hoc, I don't recall why the userspace's iovec is also updated.
>>> Perhaps my intention was to make the use of rtcan_raw_sendmsg consistent
>>> for kernel and userspace RT-Tasks so that both can rely on finding
>>> modified iovecs after calling sendmsg/recvmsg. But I'm not absolutely
>>> sure if there isn't a better explanation for this. I will try to find the
>>> reason in my backup memory. ;-)
>> So, unless we find some reason why we _must_ modify user's iovec, either
>> for send or receive, I would say: kill the user copy-back and work in
>> both case (kernel / user space caller) on the local copy of iovec (if we
>> still need to modify it all then).
> 
> Attached is a patch which leaves the caller's iovec unmodified. It compiles 
> successfully (not tested further).
> 
> 
> 
> ------------------------------------------------------------------------
> 
> Index: ChangeLog
> ===================================================================
> --- ChangeLog	(Revision 2348)
> +++ ChangeLog	(Arbeitskopie)
> @@ -1,3 +1,8 @@
> +2007-04-02  Sebastian Smolorz <ssm@domain.hid>
> +
> +	* ksrc/drivers/can/rtcan_raw.c (rtcan_raw_recvmsg, rtcan_raw_sendmsg):
> +	Remove modification of caller's original iovec.
> +
>  2007-03-31  Philippe Gerum  <rpm@xenomai.org>
>  
>  	* include/nucleus/queue.h (moveq): Fix source tail pointer.
> Index: ksrc/drivers/can/rtcan_raw.c
> ===================================================================
> --- ksrc/drivers/can/rtcan_raw.c	(Revision 2348)
> +++ ksrc/drivers/can/rtcan_raw.c	(Arbeitskopie)
> @@ -731,13 +731,6 @@ ssize_t rtcan_raw_recvmsg(struct rtdm_de
>          if (rtdm_copy_to_user(user_info, iov->iov_base, &frame,
>  			      sizeof(can_frame_t)))
>              return -EFAULT;
> -        /* Adjust iovec in the common way */
> -        iov->iov_base += sizeof(can_frame_t);
> -        iov->iov_len -= sizeof(can_frame_t);
> -        /* ... and copy it, too. */
> -        if (rtdm_copy_to_user(user_info, msg->msg_iov, iov,
> -			      sizeof(struct iovec)))
> -            return -EFAULT;
>  
>          /* Copy timestamp if existent and wanted */
>          if (msg->msg_controllen) {
> @@ -762,9 +755,6 @@ ssize_t rtcan_raw_recvmsg(struct rtdm_de
>  
>          /* Copy CAN frame */
>          memcpy(iov->iov_base, &frame, sizeof(can_frame_t));
> -        /* Adjust iovec in the common way */
> -        iov->iov_base += sizeof(can_frame_t);
> -        iov->iov_len -= sizeof(can_frame_t);
>  
>          /* Copy timestamp if existent and wanted */
>          if (msg->msg_controllen) {
> @@ -878,16 +868,6 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_de
>          frame = &frame_buf;
>      }
>  
> -    /* Adjust iovec in the common way */
> -    iov->iov_base += sizeof(can_frame_t);
> -    iov->iov_len -= sizeof(can_frame_t);
> -    /* ... and copy it back to userspace if necessary */
> -    if (user_info) {
> -        if (rtdm_copy_to_user(user_info, msg->msg_iov, iov,
> -			      sizeof(struct iovec)))
> -            return -EFAULT;
> -    }
> -
>      /* At last, we've got the frame ... */
>  
>      /* Check if DLC between 0 and 15 */


Basic ACK (as still no one came up remarking we actually need the update
of iovec).

I would just always use struct iovec iov_buf for the internal handling,
means always copy the original (also from in-kernel users) and simply
kill the struct iovec *iov indirection.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 250 bytes --]

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

* Re: [Xenomai-core] iovec overwriting by CAN stack
  2007-04-05 17:30               ` Jan Kiszka
@ 2007-04-10  7:37                 ` Sebastian Smolorz
  2007-04-10  9:43                   ` Jan Kiszka
  0 siblings, 1 reply; 11+ messages in thread
From: Sebastian Smolorz @ 2007-04-10  7:37 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Jan Kiszka wrote:
> Sebastian Smolorz wrote:
> > Jan Kiszka wrote:
> >>
> >> So, unless we find some reason why we _must_ modify user's iovec, either
> >> for send or receive, I would say: kill the user copy-back and work in
> >> both case (kernel / user space caller) on the local copy of iovec (if we
> >> still need to modify it all then).
> >
> > Attached is a patch which leaves the caller's iovec unmodified. It
> > compiles successfully (not tested further).
> >
> >
> >
> > ------------------------------------------------------------------------
> >
> > Index: ChangeLog
> > ===================================================================
> > --- ChangeLog	(Revision 2348)
> > +++ ChangeLog	(Arbeitskopie)
> > @@ -1,3 +1,8 @@
> > +2007-04-02  Sebastian Smolorz <ssm@domain.hid>
> > +
> > +	* ksrc/drivers/can/rtcan_raw.c (rtcan_raw_recvmsg, rtcan_raw_sendmsg):
> > +	Remove modification of caller's original iovec.
> > +
> >  2007-03-31  Philippe Gerum  <rpm@xenomai.org>
> >
> >  	* include/nucleus/queue.h (moveq): Fix source tail pointer.
> > Index: ksrc/drivers/can/rtcan_raw.c
> > ===================================================================
> > --- ksrc/drivers/can/rtcan_raw.c	(Revision 2348)
> > +++ ksrc/drivers/can/rtcan_raw.c	(Arbeitskopie)
> > @@ -731,13 +731,6 @@ ssize_t rtcan_raw_recvmsg(struct rtdm_de
> >          if (rtdm_copy_to_user(user_info, iov->iov_base, &frame,
> >  			      sizeof(can_frame_t)))
> >              return -EFAULT;
> > -        /* Adjust iovec in the common way */
> > -        iov->iov_base += sizeof(can_frame_t);
> > -        iov->iov_len -= sizeof(can_frame_t);
> > -        /* ... and copy it, too. */
> > -        if (rtdm_copy_to_user(user_info, msg->msg_iov, iov,
> > -			      sizeof(struct iovec)))
> > -            return -EFAULT;
> >
> >          /* Copy timestamp if existent and wanted */
> >          if (msg->msg_controllen) {
> > @@ -762,9 +755,6 @@ ssize_t rtcan_raw_recvmsg(struct rtdm_de
> >
> >          /* Copy CAN frame */
> >          memcpy(iov->iov_base, &frame, sizeof(can_frame_t));
> > -        /* Adjust iovec in the common way */
> > -        iov->iov_base += sizeof(can_frame_t);
> > -        iov->iov_len -= sizeof(can_frame_t);
> >
> >          /* Copy timestamp if existent and wanted */
> >          if (msg->msg_controllen) {
> > @@ -878,16 +868,6 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_de
> >          frame = &frame_buf;
> >      }
> >
> > -    /* Adjust iovec in the common way */
> > -    iov->iov_base += sizeof(can_frame_t);
> > -    iov->iov_len -= sizeof(can_frame_t);
> > -    /* ... and copy it back to userspace if necessary */
> > -    if (user_info) {
> > -        if (rtdm_copy_to_user(user_info, msg->msg_iov, iov,
> > -			      sizeof(struct iovec)))
> > -            return -EFAULT;
> > -    }
> > -
> >      /* At last, we've got the frame ... */
> >
> >      /* Check if DLC between 0 and 15 */
>
> Basic ACK (as still no one came up remarking we actually need the update
> of iovec).
>
> I would just always use struct iovec iov_buf for the internal handling,
> means always copy the original (also from in-kernel users) and simply
> kill the struct iovec *iov indirection.

IMHO this is not necessary because the original iovec is not modified 
unexpectedly even if it resides in kernel space.

-- 
Sebastian


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

* Re: [Xenomai-core] iovec overwriting by CAN stack
  2007-04-10  7:37                 ` [Xenomai-core] " Sebastian Smolorz
@ 2007-04-10  9:43                   ` Jan Kiszka
  0 siblings, 0 replies; 11+ messages in thread
From: Jan Kiszka @ 2007-04-10  9:43 UTC (permalink / raw)
  To: Sebastian Smolorz; +Cc: xenomai-core

[-- Attachment #1: Type: text/plain, Size: 3565 bytes --]

Sebastian Smolorz wrote:
> Jan Kiszka wrote:
>> Sebastian Smolorz wrote:
>>> Jan Kiszka wrote:
>>>> So, unless we find some reason why we _must_ modify user's iovec, either
>>>> for send or receive, I would say: kill the user copy-back and work in
>>>> both case (kernel / user space caller) on the local copy of iovec (if we
>>>> still need to modify it all then).
>>> Attached is a patch which leaves the caller's iovec unmodified. It
>>> compiles successfully (not tested further).
>>>
>>>
>>>
>>> ------------------------------------------------------------------------
>>>
>>> Index: ChangeLog
>>> ===================================================================
>>> --- ChangeLog	(Revision 2348)
>>> +++ ChangeLog	(Arbeitskopie)
>>> @@ -1,3 +1,8 @@
>>> +2007-04-02  Sebastian Smolorz <ssm@domain.hid>
>>> +
>>> +	* ksrc/drivers/can/rtcan_raw.c (rtcan_raw_recvmsg, rtcan_raw_sendmsg):
>>> +	Remove modification of caller's original iovec.
>>> +
>>>  2007-03-31  Philippe Gerum  <rpm@xenomai.org>
>>>
>>>  	* include/nucleus/queue.h (moveq): Fix source tail pointer.
>>> Index: ksrc/drivers/can/rtcan_raw.c
>>> ===================================================================
>>> --- ksrc/drivers/can/rtcan_raw.c	(Revision 2348)
>>> +++ ksrc/drivers/can/rtcan_raw.c	(Arbeitskopie)
>>> @@ -731,13 +731,6 @@ ssize_t rtcan_raw_recvmsg(struct rtdm_de
>>>          if (rtdm_copy_to_user(user_info, iov->iov_base, &frame,
>>>  			      sizeof(can_frame_t)))
>>>              return -EFAULT;
>>> -        /* Adjust iovec in the common way */
>>> -        iov->iov_base += sizeof(can_frame_t);
>>> -        iov->iov_len -= sizeof(can_frame_t);
>>> -        /* ... and copy it, too. */
>>> -        if (rtdm_copy_to_user(user_info, msg->msg_iov, iov,
>>> -			      sizeof(struct iovec)))
>>> -            return -EFAULT;
>>>
>>>          /* Copy timestamp if existent and wanted */
>>>          if (msg->msg_controllen) {
>>> @@ -762,9 +755,6 @@ ssize_t rtcan_raw_recvmsg(struct rtdm_de
>>>
>>>          /* Copy CAN frame */
>>>          memcpy(iov->iov_base, &frame, sizeof(can_frame_t));
>>> -        /* Adjust iovec in the common way */
>>> -        iov->iov_base += sizeof(can_frame_t);
>>> -        iov->iov_len -= sizeof(can_frame_t);
>>>
>>>          /* Copy timestamp if existent and wanted */
>>>          if (msg->msg_controllen) {
>>> @@ -878,16 +868,6 @@ ssize_t rtcan_raw_sendmsg(struct rtdm_de
>>>          frame = &frame_buf;
>>>      }
>>>
>>> -    /* Adjust iovec in the common way */
>>> -    iov->iov_base += sizeof(can_frame_t);
>>> -    iov->iov_len -= sizeof(can_frame_t);
>>> -    /* ... and copy it back to userspace if necessary */
>>> -    if (user_info) {
>>> -        if (rtdm_copy_to_user(user_info, msg->msg_iov, iov,
>>> -			      sizeof(struct iovec)))
>>> -            return -EFAULT;
>>> -    }
>>> -
>>>      /* At last, we've got the frame ... */
>>>
>>>      /* Check if DLC between 0 and 15 */
>> Basic ACK (as still no one came up remarking we actually need the update
>> of iovec).
>>
>> I would just always use struct iovec iov_buf for the internal handling,
>> means always copy the original (also from in-kernel users) and simply
>> kill the struct iovec *iov indirection.
> 
> IMHO this is not necessary because the original iovec is not modified 
> unexpectedly even if it resides in kernel space.
> 

It as almost noise, my idea was just to save the additional indirections
(iov->xxx vs. iov_buf.xxx) for the succeeding accesses.


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 250 bytes --]

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

end of thread, other threads:[~2007-04-10  9:43 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-03-30  0:59 [Xenomai-core] iovec overwriting by CAN stack Jan Kiszka
2007-03-30  6:44 ` [Xenomai-core] " Wolfgang Grandegger
2007-03-30  6:50   ` Jan Kiszka
2007-03-30 12:18     ` Sebastian Smolorz
2007-03-30 12:27       ` Jan Kiszka
2007-03-30 13:06         ` Sebastian Smolorz
2007-03-30 14:17           ` Jan Kiszka
2007-04-02  8:09             ` Sebastian Smolorz
2007-04-05 17:30               ` Jan Kiszka
2007-04-10  7:37                 ` [Xenomai-core] " Sebastian Smolorz
2007-04-10  9:43                   ` 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.