All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 1/3] y2038: cobalt/posix/io: Adding recvmmsg64
@ 2021-09-30  2:22 Song Chen
  2021-10-01 10:15 ` Bezdeka, Florian
  2021-10-04 15:03 ` Bezdeka, Florian
  0 siblings, 2 replies; 3+ messages in thread
From: Song Chen @ 2021-09-30  2:22 UTC (permalink / raw)
  To: florian.bezdeka, xenomai

Add a syscall specific for recvmmsg64 with 64bit time_t.

---
v2:
1, adjust indentation, different files have different indentation, see
   ./kernel/cobalt/posix/io.h
   ./kernel/cobalt/posix/syscall32.h
   I followed the function definition around mine
2, remove duplicated helper get_timespec64_xeno
   get_timespec64 is defined in vanilla kernel, that's why suffix _xeno,
   but it still looks weired, it does nothing but just call
   cobalt_get_timespec64, so why not call cobalt_get_timespec64 directly
   with a little change of its definition.

v3:
1, undo #2 in v2, instead, introduce __rtdm_fd_recvmmsg64

Signed-off-by: Song Chen <chensong_2000@189.cn>
---
 include/cobalt/kernel/rtdm/fd.h |  5 +++++
 include/cobalt/uapi/syscall.h   |  1 +
 kernel/cobalt/posix/io.c        |  9 +++++++++
 kernel/cobalt/posix/io.h        |  5 +++++
 kernel/cobalt/posix/syscall32.c |  9 +++++++++
 kernel/cobalt/posix/syscall32.h |  6 ++++++
 kernel/cobalt/rtdm/fd.c         | 19 ++++++++++++++++++-
 7 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/include/cobalt/kernel/rtdm/fd.h b/include/cobalt/kernel/rtdm/fd.h
index 37a09c4..4dc67e5 100644
--- a/include/cobalt/kernel/rtdm/fd.h
+++ b/include/cobalt/kernel/rtdm/fd.h
@@ -382,6 +382,11 @@ int __rtdm_fd_recvmmsg(int ufd, void __user *u_msgvec, unsigned int vlen,
 		       int (*put_mmsg)(void __user **u_mmsg_p, const struct mmsghdr *mmsg),
 		       int (*get_timespec)(struct timespec64 *ts, const void __user *u_ts));
 
+int __rtdm_fd_recvmmsg64(int ufd, void __user *u_msgvec, unsigned int vlen,
+		       unsigned int flags, void __user *u_timeout,
+		       int (*get_mmsg)(struct mmsghdr *mmsg, void __user *u_mmsg),
+		       int (*put_mmsg)(void __user **u_mmsg_p, const struct mmsghdr *mmsg));
+
 ssize_t rtdm_fd_sendmsg(int ufd, const struct user_msghdr *msg,
 			int flags);
 
diff --git a/include/cobalt/uapi/syscall.h b/include/cobalt/uapi/syscall.h
index 16edce1..1523ddd 100644
--- a/include/cobalt/uapi/syscall.h
+++ b/include/cobalt/uapi/syscall.h
@@ -134,6 +134,7 @@
 #define sc_cobalt_sigtimedwait64		111
 #define sc_cobalt_monitor_wait64		112
 #define sc_cobalt_event_wait64			113
+#define sc_cobalt_recvmmsg64			114
 
 #define __NR_COBALT_SYSCALLS			128 /* Power of 2 */
 
diff --git a/kernel/cobalt/posix/io.c b/kernel/cobalt/posix/io.c
index 0c17f55..595bf67 100644
--- a/kernel/cobalt/posix/io.c
+++ b/kernel/cobalt/posix/io.c
@@ -26,6 +26,7 @@
 #include "internal.h"
 #include "clock.h"
 #include "io.h"
+#include <cobalt/kernel/time.h>
 
 COBALT_SYSCALL(open, lostage,
 	       (const char __user *u_path, int oflag))
@@ -121,6 +122,14 @@ COBALT_SYSCALL(recvmmsg, primary,
 				  get_mmsg, put_mmsg, get_timespec);
 }
 
+COBALT_SYSCALL(recvmmsg64, primary,
+	       (int fd, struct mmsghdr __user *u_msgvec, unsigned int vlen,
+		unsigned int flags, struct __kernel_timespec __user *u_timeout))
+{
+	return __rtdm_fd_recvmmsg64(fd, u_msgvec, vlen, flags, u_timeout,
+				  get_mmsg, put_mmsg);
+}
+
 COBALT_SYSCALL(sendmsg, handover,
 	       (int fd, struct user_msghdr __user *umsg, int flags))
 {
diff --git a/kernel/cobalt/posix/io.h b/kernel/cobalt/posix/io.h
index d9f29fa..842db08 100644
--- a/kernel/cobalt/posix/io.h
+++ b/kernel/cobalt/posix/io.h
@@ -58,6 +58,11 @@ COBALT_SYSCALL_DECL(recvmmsg,
 		    (int fd, struct mmsghdr __user *u_msgvec, unsigned int vlen,
 		     unsigned int flags, struct __user_old_timespec __user *u_timeout));
 
+COBALT_SYSCALL_DECL(recvmmsg64,
+		    (int fd, struct mmsghdr __user *u_msgvec, unsigned int vlen,
+		     unsigned int flags,
+		     struct __kernel_timespec __user *u_timeout));
+
 COBALT_SYSCALL_DECL(sendmsg,
 		    (int fd, struct user_msghdr __user *umsg, int flags));
 
diff --git a/kernel/cobalt/posix/syscall32.c b/kernel/cobalt/posix/syscall32.c
index 2d88fac..15a2d22 100644
--- a/kernel/cobalt/posix/syscall32.c
+++ b/kernel/cobalt/posix/syscall32.c
@@ -860,6 +860,15 @@ COBALT_SYSCALL32emu(recvmmsg, primary,
 				  get_timespec32);
 }
 
+COBALT_SYSCALL32emu(recvmmsg64, primary,
+	      (int ufd, struct compat_mmsghdr __user *u_msgvec,
+		     unsigned int vlen, unsigned int flags,
+		     struct __kernel_timespec *u_timeout))
+{
+	return __rtdm_fd_recvmmsg64(ufd, u_msgvec, vlen, flags, u_timeout,
+				  get_mmsg32, put_mmsg32);
+}
+
 COBALT_SYSCALL32emu(sendmsg, handover,
 		    (int fd, struct compat_msghdr __user *umsg, int flags))
 {
diff --git a/kernel/cobalt/posix/syscall32.h b/kernel/cobalt/posix/syscall32.h
index 3eb6657..72e32f4 100644
--- a/kernel/cobalt/posix/syscall32.h
+++ b/kernel/cobalt/posix/syscall32.h
@@ -253,6 +253,12 @@ COBALT_SYSCALL32emu_DECL(recvmmsg,
 			  unsigned int vlen,
 			  unsigned int flags, struct old_timespec32 *u_timeout));
 
+COBALT_SYSCALL32emu_DECL(recvmmsg64,
+			 (int fd, struct compat_mmsghdr __user *u_msgvec,
+			  unsigned int vlen,
+			  unsigned int flags,
+			  struct __kernel_timespec *u_timeout));
+
 COBALT_SYSCALL32emu_DECL(sendmsg,
 			 (int fd, struct compat_msghdr __user *umsg,
 			  int flags));
diff --git a/kernel/cobalt/rtdm/fd.c b/kernel/cobalt/rtdm/fd.c
index 8e4e15e..91c3757 100644
--- a/kernel/cobalt/rtdm/fd.c
+++ b/kernel/cobalt/rtdm/fd.c
@@ -28,6 +28,7 @@
 #include <cobalt/kernel/registry.h>
 #include <cobalt/kernel/lock.h>
 #include <cobalt/kernel/ppd.h>
+#include <cobalt/kernel/time.h>
 #include <pipeline/inband_work.h>
 #include <trace/events/cobalt-rtdm.h>
 #include <rtdm/fd.h>
@@ -689,7 +690,7 @@ int __rtdm_fd_recvmmsg(int ufd, void __user *u_msgvec, unsigned int vlen,
 		if (ret)
 			goto fail;
 
-		if ((unsigned long)ts.tv_nsec >= ONE_BILLION) {
+		if (!timespec64_valid(&ts)) {
 			ret = -EINVAL;
 			goto fail;
 		}
@@ -753,6 +754,22 @@ out:
 	return ret;
 }
 
+static inline int __rtdm_fetch_timeout64(struct timespec64 *ts,
+					const void __user *u_ts)
+{
+	return u_ts == NULL ? -EFAULT : cobalt_get_timespec64(ts, u_ts);
+}
+
+int __rtdm_fd_recvmmsg64(int ufd, void __user *u_msgvec, unsigned int vlen,
+		       unsigned int flags, void __user *u_timeout,
+		       int (*get_mmsg)(struct mmsghdr *mmsg, void __user *u_mmsg),
+		       int (*put_mmsg)(void __user **u_mmsg_p, const struct mmsghdr *mmsg))
+{
+	return __rtdm_fd_recvmmsg(ufd, u_msgvec, vlen, flags, u_timeout,
+				  get_mmsg, put_mmsg, __rtdm_fetch_timeout64);
+}
+
+
 ssize_t rtdm_fd_sendmsg(int ufd, const struct user_msghdr *msg, int flags)
 {
 	struct rtdm_fd *fd;
-- 
2.7.4



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

* Re: [PATCH v4 1/3] y2038: cobalt/posix/io: Adding recvmmsg64
  2021-09-30  2:22 [PATCH v4 1/3] y2038: cobalt/posix/io: Adding recvmmsg64 Song Chen
@ 2021-10-01 10:15 ` Bezdeka, Florian
  2021-10-04 15:03 ` Bezdeka, Florian
  1 sibling, 0 replies; 3+ messages in thread
From: Bezdeka, Florian @ 2021-10-01 10:15 UTC (permalink / raw)
  To: xenomai, chensong_2000

Hi Song!

On Thu, 2021-09-30 at 10:22 +0800, Song Chen wrote:
> Add a syscall specific for recvmmsg64 with 64bit time_t.
> 
> ---
> v2:
> 1, adjust indentation, different files have different indentation, see
>    ./kernel/cobalt/posix/io.h
>    ./kernel/cobalt/posix/syscall32.h
>    I followed the function definition around mine
> 2, remove duplicated helper get_timespec64_xeno
>    get_timespec64 is defined in vanilla kernel, that's why suffix _xeno,
>    but it still looks weired, it does nothing but just call
>    cobalt_get_timespec64, so why not call cobalt_get_timespec64 directly
>    with a little change of its definition.
> 
> v3:
> 1, undo #2 in v2, instead, introduce __rtdm_fd_recvmmsg64
> 
> Signed-off-by: Song Chen <chensong_2000@189.cn>

That's the wrong place for the Signed-off-by tag. I will fix that up
(as well as some code formatting issues this patch has) during pre-
merge. The problem here is that the Signed-off-by tag is not part of
the commit message, so it's not getting part of the git history.

No further action required on your side but please note the comments
below.

> ---
>  include/cobalt/kernel/rtdm/fd.h |  5 +++++
>  include/cobalt/uapi/syscall.h   |  1 +
>  kernel/cobalt/posix/io.c        |  9 +++++++++
>  kernel/cobalt/posix/io.h        |  5 +++++
>  kernel/cobalt/posix/syscall32.c |  9 +++++++++
>  kernel/cobalt/posix/syscall32.h |  6 ++++++
>  kernel/cobalt/rtdm/fd.c         | 19 ++++++++++++++++++-
>  7 files changed, 53 insertions(+), 1 deletion(-)
> 
> diff --git a/include/cobalt/kernel/rtdm/fd.h b/include/cobalt/kernel/rtdm/fd.h
> index 37a09c4..4dc67e5 100644
> --- a/include/cobalt/kernel/rtdm/fd.h
> +++ b/include/cobalt/kernel/rtdm/fd.h
> @@ -382,6 +382,11 @@ int __rtdm_fd_recvmmsg(int ufd, void __user *u_msgvec, unsigned int vlen,
>  		       int (*put_mmsg)(void __user **u_mmsg_p, const struct mmsghdr *mmsg),
>  		       int (*get_timespec)(struct timespec64 *ts, const void __user *u_ts));
>  
> +int __rtdm_fd_recvmmsg64(int ufd, void __user *u_msgvec, unsigned int vlen,
> +		       unsigned int flags, void __user *u_timeout,
> +		       int (*get_mmsg)(struct mmsghdr *mmsg, void __user *u_mmsg),
> +		       int (*put_mmsg)(void __user **u_mmsg_p, const struct mmsghdr *mmsg));
> +
>  ssize_t rtdm_fd_sendmsg(int ufd, const struct user_msghdr *msg,
>  			int flags);
>  
> diff --git a/include/cobalt/uapi/syscall.h b/include/cobalt/uapi/syscall.h
> index 16edce1..1523ddd 100644
> --- a/include/cobalt/uapi/syscall.h
> +++ b/include/cobalt/uapi/syscall.h
> @@ -134,6 +134,7 @@
>  #define sc_cobalt_sigtimedwait64		111
>  #define sc_cobalt_monitor_wait64		112
>  #define sc_cobalt_event_wait64			113
> +#define sc_cobalt_recvmmsg64			114
>  
>  #define __NR_COBALT_SYSCALLS			128 /* Power of 2 */
>  
> diff --git a/kernel/cobalt/posix/io.c b/kernel/cobalt/posix/io.c
> index 0c17f55..595bf67 100644
> --- a/kernel/cobalt/posix/io.c
> +++ b/kernel/cobalt/posix/io.c
> @@ -26,6 +26,7 @@
>  #include "internal.h"
>  #include "clock.h"
>  #include "io.h"
> +#include <cobalt/kernel/time.h>
>  
>  COBALT_SYSCALL(open, lostage,
>  	       (const char __user *u_path, int oflag))
> @@ -121,6 +122,14 @@ COBALT_SYSCALL(recvmmsg, primary,
>  				  get_mmsg, put_mmsg, get_timespec);
>  }
>  
> +COBALT_SYSCALL(recvmmsg64, primary,
> +	       (int fd, struct mmsghdr __user *u_msgvec, unsigned int vlen,
> +		unsigned int flags, struct __kernel_timespec __user *u_timeout))
> +{
> +	return __rtdm_fd_recvmmsg64(fd, u_msgvec, vlen, flags, u_timeout,
> +				  get_mmsg, put_mmsg);

Style: Arguments are not aligned.

> +}
> +
>  COBALT_SYSCALL(sendmsg, handover,
>  	       (int fd, struct user_msghdr __user *umsg, int flags))
>  {
> diff --git a/kernel/cobalt/posix/io.h b/kernel/cobalt/posix/io.h
> index d9f29fa..842db08 100644
> --- a/kernel/cobalt/posix/io.h
> +++ b/kernel/cobalt/posix/io.h
> @@ -58,6 +58,11 @@ COBALT_SYSCALL_DECL(recvmmsg,
>  		    (int fd, struct mmsghdr __user *u_msgvec, unsigned int vlen,
>  		     unsigned int flags, struct __user_old_timespec __user *u_timeout));
>  
> +COBALT_SYSCALL_DECL(recvmmsg64,
> +		    (int fd, struct mmsghdr __user *u_msgvec, unsigned int vlen,

Style: Arguments or brackets are not aligned in the way other
COBALT_SYSCALL_DECL usage in this file are.

> +		     unsigned int flags,
> +		     struct __kernel_timespec __user *u_timeout));
> +
>  COBALT_SYSCALL_DECL(sendmsg,
>  		    (int fd, struct user_msghdr __user *umsg, int flags));
>  
> diff --git a/kernel/cobalt/posix/syscall32.c b/kernel/cobalt/posix/syscall32.c
> index 2d88fac..15a2d22 100644
> --- a/kernel/cobalt/posix/syscall32.c
> +++ b/kernel/cobalt/posix/syscall32.c
> @@ -860,6 +860,15 @@ COBALT_SYSCALL32emu(recvmmsg, primary,
>  				  get_timespec32);
>  }
>  
> +COBALT_SYSCALL32emu(recvmmsg64, primary,
> +	      (int ufd, struct compat_mmsghdr __user *u_msgvec,
> +		     unsigned int vlen, unsigned int flags,
> +		     struct __kernel_timespec *u_timeout))

Style: See other COBALT_SYSCALL32emu usages in the same file.
Alignement...

> +{
> +	return __rtdm_fd_recvmmsg64(ufd, u_msgvec, vlen, flags, u_timeout,
> +				  get_mmsg32, put_mmsg32);

Style: arguments not aligned

> +}
> +
>  COBALT_SYSCALL32emu(sendmsg, handover,
>  		    (int fd, struct compat_msghdr __user *umsg, int flags))
>  {
> diff --git a/kernel/cobalt/posix/syscall32.h b/kernel/cobalt/posix/syscall32.h
> index 3eb6657..72e32f4 100644
> --- a/kernel/cobalt/posix/syscall32.h
> +++ b/kernel/cobalt/posix/syscall32.h
> @@ -253,6 +253,12 @@ COBALT_SYSCALL32emu_DECL(recvmmsg,
>  			  unsigned int vlen,
>  			  unsigned int flags, struct old_timespec32 *u_timeout));
>  
> +COBALT_SYSCALL32emu_DECL(recvmmsg64,
> +			 (int fd, struct compat_mmsghdr __user *u_msgvec,
> +			  unsigned int vlen,
> +			  unsigned int flags,
> +			  struct __kernel_timespec *u_timeout));
> +
>  COBALT_SYSCALL32emu_DECL(sendmsg,
>  			 (int fd, struct compat_msghdr __user *umsg,
>  			  int flags));
> diff --git a/kernel/cobalt/rtdm/fd.c b/kernel/cobalt/rtdm/fd.c
> index 8e4e15e..91c3757 100644
> --- a/kernel/cobalt/rtdm/fd.c
> +++ b/kernel/cobalt/rtdm/fd.c
> @@ -28,6 +28,7 @@
>  #include <cobalt/kernel/registry.h>
>  #include <cobalt/kernel/lock.h>
>  #include <cobalt/kernel/ppd.h>
> +#include <cobalt/kernel/time.h>
>  #include <pipeline/inband_work.h>
>  #include <trace/events/cobalt-rtdm.h>
>  #include <rtdm/fd.h>
> @@ -689,7 +690,7 @@ int __rtdm_fd_recvmmsg(int ufd, void __user *u_msgvec, unsigned int vlen,
>  		if (ret)
>  			goto fail;
>  
> -		if ((unsigned long)ts.tv_nsec >= ONE_BILLION) {
> +		if (!timespec64_valid(&ts)) {
>  			ret = -EINVAL;
>  			goto fail;
>  		}
> @@ -753,6 +754,22 @@ out:
>  	return ret;
>  }
>  
> +static inline int __rtdm_fetch_timeout64(struct timespec64 *ts,
> +					const void __user *u_ts)
> +{
> +	return u_ts == NULL ? -EFAULT : cobalt_get_timespec64(ts, u_ts);
> +}
> +
> +int __rtdm_fd_recvmmsg64(int ufd, void __user *u_msgvec, unsigned int vlen,
> +		       unsigned int flags, void __user *u_timeout,
> +		       int (*get_mmsg)(struct mmsghdr *mmsg, void __user *u_mmsg),
> +		       int (*put_mmsg)(void __user **u_mmsg_p, const struct mmsghdr *mmsg))

Style: Arguments not aligned.


> +{
> +	return __rtdm_fd_recvmmsg(ufd, u_msgvec, vlen, flags, u_timeout,
> +				  get_mmsg, put_mmsg, __rtdm_fetch_timeout64);
> +}
> +
> +
>  ssize_t rtdm_fd_sendmsg(int ufd, const struct user_msghdr *msg, int flags)
>  {
>  	struct rtdm_fd *fd;


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

* Re: [PATCH v4 1/3] y2038: cobalt/posix/io: Adding recvmmsg64
  2021-09-30  2:22 [PATCH v4 1/3] y2038: cobalt/posix/io: Adding recvmmsg64 Song Chen
  2021-10-01 10:15 ` Bezdeka, Florian
@ 2021-10-04 15:03 ` Bezdeka, Florian
  1 sibling, 0 replies; 3+ messages in thread
From: Bezdeka, Florian @ 2021-10-04 15:03 UTC (permalink / raw)
  To: xenomai, chensong_2000

On Thu, 2021-09-30 at 10:22 +0800, Song Chen wrote:
> Add a syscall specific for recvmmsg64 with 64bit time_t.
> 
> ---
> v2:
> 1, adjust indentation, different files have different indentation, see
>    ./kernel/cobalt/posix/io.h
>    ./kernel/cobalt/posix/syscall32.h
>    I followed the function definition around mine
> 2, remove duplicated helper get_timespec64_xeno
>    get_timespec64 is defined in vanilla kernel, that's why suffix _xeno,
>    but it still looks weired, it does nothing but just call
>    cobalt_get_timespec64, so why not call cobalt_get_timespec64 directly
>    with a little change of its definition.
> 
> v3:
> 1, undo #2 in v2, instead, introduce __rtdm_fd_recvmmsg64
> 
> Signed-off-by: Song Chen <chensong_2000@189.cn>
> ---
>  include/cobalt/kernel/rtdm/fd.h |  5 +++++
>  include/cobalt/uapi/syscall.h   |  1 +
>  kernel/cobalt/posix/io.c        |  9 +++++++++
>  kernel/cobalt/posix/io.h        |  5 +++++
>  kernel/cobalt/posix/syscall32.c |  9 +++++++++
>  kernel/cobalt/posix/syscall32.h |  6 ++++++
>  kernel/cobalt/rtdm/fd.c         | 19 ++++++++++++++++++-
>  7 files changed, 53 insertions(+), 1 deletion(-)
> 
> diff --git a/include/cobalt/kernel/rtdm/fd.h b/include/cobalt/kernel/rtdm/fd.h
> index 37a09c4..4dc67e5 100644
> --- a/include/cobalt/kernel/rtdm/fd.h
> +++ b/include/cobalt/kernel/rtdm/fd.h
> @@ -382,6 +382,11 @@ int __rtdm_fd_recvmmsg(int ufd, void __user *u_msgvec, unsigned int vlen,
>  		       int (*put_mmsg)(void __user **u_mmsg_p, const struct mmsghdr *mmsg),
>  		       int (*get_timespec)(struct timespec64 *ts, const void __user *u_ts));
>  
> +int __rtdm_fd_recvmmsg64(int ufd, void __user *u_msgvec, unsigned int vlen,
> +		       unsigned int flags, void __user *u_timeout,
> +		       int (*get_mmsg)(struct mmsghdr *mmsg, void __user *u_mmsg),
> +		       int (*put_mmsg)(void __user **u_mmsg_p, const struct mmsghdr *mmsg));
> +
>  ssize_t rtdm_fd_sendmsg(int ufd, const struct user_msghdr *msg,
>  			int flags);
>  
> diff --git a/include/cobalt/uapi/syscall.h b/include/cobalt/uapi/syscall.h
> index 16edce1..1523ddd 100644
> --- a/include/cobalt/uapi/syscall.h
> +++ b/include/cobalt/uapi/syscall.h
> @@ -134,6 +134,7 @@
>  #define sc_cobalt_sigtimedwait64		111
>  #define sc_cobalt_monitor_wait64		112
>  #define sc_cobalt_event_wait64			113
> +#define sc_cobalt_recvmmsg64			114

Whenever you add something here don't forget to update the definition
of __cobalt_syscall_name in cobalt-posix.h (tracing infrastructure)

I will fix that up for recmmsg64 but please make sure it's not missing
in further y2038 patches. It takes some time to debug that...

>  
>  #define __NR_COBALT_SYSCALLS			128 /* Power of 2 */
>  
> diff --git a/kernel/cobalt/posix/io.c b/kernel/cobalt/posix/io.c
> index 0c17f55..595bf67 100644
> --- a/kernel/cobalt/posix/io.c
> +++ b/kernel/cobalt/posix/io.c
> @@ -26,6 +26,7 @@
>  #include "internal.h"
>  #include "clock.h"
>  #include "io.h"
> +#include <cobalt/kernel/time.h>
>  
>  COBALT_SYSCALL(open, lostage,
>  	       (const char __user *u_path, int oflag))
> @@ -121,6 +122,14 @@ COBALT_SYSCALL(recvmmsg, primary,
>  				  get_mmsg, put_mmsg, get_timespec);
>  }
>  
> +COBALT_SYSCALL(recvmmsg64, primary,
> +	       (int fd, struct mmsghdr __user *u_msgvec, unsigned int vlen,
> +		unsigned int flags, struct __kernel_timespec __user *u_timeout))
> +{
> +	return __rtdm_fd_recvmmsg64(fd, u_msgvec, vlen, flags, u_timeout,
> +				  get_mmsg, put_mmsg);
> +}
> +
>  COBALT_SYSCALL(sendmsg, handover,
>  	       (int fd, struct user_msghdr __user *umsg, int flags))
>  {
> diff --git a/kernel/cobalt/posix/io.h b/kernel/cobalt/posix/io.h
> index d9f29fa..842db08 100644
> --- a/kernel/cobalt/posix/io.h
> +++ b/kernel/cobalt/posix/io.h
> @@ -58,6 +58,11 @@ COBALT_SYSCALL_DECL(recvmmsg,
>  		    (int fd, struct mmsghdr __user *u_msgvec, unsigned int vlen,
>  		     unsigned int flags, struct __user_old_timespec __user *u_timeout));
>  
> +COBALT_SYSCALL_DECL(recvmmsg64,
> +		    (int fd, struct mmsghdr __user *u_msgvec, unsigned int vlen,
> +		     unsigned int flags,
> +		     struct __kernel_timespec __user *u_timeout));
> +
>  COBALT_SYSCALL_DECL(sendmsg,
>  		    (int fd, struct user_msghdr __user *umsg, int flags));
>  
> diff --git a/kernel/cobalt/posix/syscall32.c b/kernel/cobalt/posix/syscall32.c
> index 2d88fac..15a2d22 100644
> --- a/kernel/cobalt/posix/syscall32.c
> +++ b/kernel/cobalt/posix/syscall32.c
> @@ -860,6 +860,15 @@ COBALT_SYSCALL32emu(recvmmsg, primary,
>  				  get_timespec32);
>  }
>  
> +COBALT_SYSCALL32emu(recvmmsg64, primary,
> +	      (int ufd, struct compat_mmsghdr __user *u_msgvec,
> +		     unsigned int vlen, unsigned int flags,
> +		     struct __kernel_timespec *u_timeout))
> +{
> +	return __rtdm_fd_recvmmsg64(ufd, u_msgvec, vlen, flags, u_timeout,
> +				  get_mmsg32, put_mmsg32);
> +}
> +
>  COBALT_SYSCALL32emu(sendmsg, handover,
>  		    (int fd, struct compat_msghdr __user *umsg, int flags))
>  {
> diff --git a/kernel/cobalt/posix/syscall32.h b/kernel/cobalt/posix/syscall32.h
> index 3eb6657..72e32f4 100644
> --- a/kernel/cobalt/posix/syscall32.h
> +++ b/kernel/cobalt/posix/syscall32.h
> @@ -253,6 +253,12 @@ COBALT_SYSCALL32emu_DECL(recvmmsg,
>  			  unsigned int vlen,
>  			  unsigned int flags, struct old_timespec32 *u_timeout));
>  
> +COBALT_SYSCALL32emu_DECL(recvmmsg64,
> +			 (int fd, struct compat_mmsghdr __user *u_msgvec,
> +			  unsigned int vlen,
> +			  unsigned int flags,
> +			  struct __kernel_timespec *u_timeout));
> +
>  COBALT_SYSCALL32emu_DECL(sendmsg,
>  			 (int fd, struct compat_msghdr __user *umsg,
>  			  int flags));
> diff --git a/kernel/cobalt/rtdm/fd.c b/kernel/cobalt/rtdm/fd.c
> index 8e4e15e..91c3757 100644
> --- a/kernel/cobalt/rtdm/fd.c
> +++ b/kernel/cobalt/rtdm/fd.c
> @@ -28,6 +28,7 @@
>  #include <cobalt/kernel/registry.h>
>  #include <cobalt/kernel/lock.h>
>  #include <cobalt/kernel/ppd.h>
> +#include <cobalt/kernel/time.h>
>  #include <pipeline/inband_work.h>
>  #include <trace/events/cobalt-rtdm.h>
>  #include <rtdm/fd.h>
> @@ -689,7 +690,7 @@ int __rtdm_fd_recvmmsg(int ufd, void __user *u_msgvec, unsigned int vlen,
>  		if (ret)
>  			goto fail;
>  
> -		if ((unsigned long)ts.tv_nsec >= ONE_BILLION) {
> +		if (!timespec64_valid(&ts)) {
>  			ret = -EINVAL;
>  			goto fail;
>  		}
> @@ -753,6 +754,22 @@ out:
>  	return ret;
>  }
>  
> +static inline int __rtdm_fetch_timeout64(struct timespec64 *ts,
> +					const void __user *u_ts)
> +{
> +	return u_ts == NULL ? -EFAULT : cobalt_get_timespec64(ts, u_ts);
> +}
> +
> +int __rtdm_fd_recvmmsg64(int ufd, void __user *u_msgvec, unsigned int vlen,
> +		       unsigned int flags, void __user *u_timeout,
> +		       int (*get_mmsg)(struct mmsghdr *mmsg, void __user *u_mmsg),
> +		       int (*put_mmsg)(void __user **u_mmsg_p, const struct mmsghdr *mmsg))
> +{
> +	return __rtdm_fd_recvmmsg(ufd, u_msgvec, vlen, flags, u_timeout,
> +				  get_mmsg, put_mmsg, __rtdm_fetch_timeout64);
> +}
> +
> +
>  ssize_t rtdm_fd_sendmsg(int ufd, const struct user_msghdr *msg, int flags)
>  {
>  	struct rtdm_fd *fd;


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

end of thread, other threads:[~2021-10-04 15:03 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-30  2:22 [PATCH v4 1/3] y2038: cobalt/posix/io: Adding recvmmsg64 Song Chen
2021-10-01 10:15 ` Bezdeka, Florian
2021-10-04 15:03 ` Bezdeka, Florian

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.