* [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.