[v2,12/16] Use shmat syscall for Linux implementation
Commit Message
Changes from previous version:
- Use __ASSUME_SYSVIPC_SYSCALL instead of __NR_syscall to issue the
wired syscall or the ipc one.
--
This patch add a direct call to shmat syscall if it is supported by
kernel features.
Checked on x86_64, i686, powerpc64le, aarch64, and armhf.
* sysdeps/unix/sysv/linux/shmat.c (shmat): Use shmat syscall if it is
defined.
---
ChangeLog | 3 +++
sysdeps/unix/sysv/linux/shmat.c | 17 ++++++++---------
2 files changed, 11 insertions(+), 9 deletions(-)
Comments
On Wednesday, November 2, 2016 5:26:49 PM CET Adhemerval Zanella wrote:
> @@ -31,17 +28,19 @@
> void *
> shmat (int shmid, const void *shmaddr, int shmflg)
> {
> +#ifdef __ASSUME_SYSVIPC_SYSCALL
> + return INLINE_SYSCALL_CALL (shmat, shmid, shmaddr, shmflg);
> +#else
> INTERNAL_SYSCALL_DECL(err);
> unsigned long resultvar;
> void *raddr;
>
I looked at the cross-reference for system call tables and found
that alpha does not define __NR_shmat but instead has __NR_osf_shmat
Will that get handled correctly by your code?
Arnd
On 07/11/2016 09:02, Arnd Bergmann wrote:
> On Wednesday, November 2, 2016 5:26:49 PM CET Adhemerval Zanella wrote:
>> @@ -31,17 +28,19 @@
>> void *
>> shmat (int shmid, const void *shmaddr, int shmflg)
>> {
>> +#ifdef __ASSUME_SYSVIPC_SYSCALL
>> + return INLINE_SYSCALL_CALL (shmat, shmid, shmaddr, shmflg);
>> +#else
>> INTERNAL_SYSCALL_DECL(err);
>> unsigned long resultvar;
>> void *raddr;
>>
>
> I looked at the cross-reference for system call tables and found
> that alpha does not define __NR_shmat but instead has __NR_osf_shmat
>
> Will that get handled correctly by your code?
>
> Arnd
No, but at least it does not prevent alpha build since it uses
the syscalls.list instead. However adjusting it should be simple,
it would be something like __NR_fadvise64_64 for arm (where it
should be __NR_arm_fadvise64_64 and it is handled on
kernel-features.h).
I tried to avoid remove the syscalls.list usage for architecture
that is already using it, but thinking twice for consolidation idea
it would be better to have all architecture to use only a simple
syscall generation mechanism for a syscall. I will add it on the
patch and send a v3.
@@ -16,13 +16,10 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
-#include <errno.h>
-#include <sys/shm.h>
+#include <sys/msg.h>
#include <ipc_priv.h>
-
#include <sysdep.h>
-#include <unistd.h>
-#include <sys/syscall.h>
+#include <errno.h>
/* Attach the shared memory segment associated with SHMID to the data
segment of the calling process. SHMADDR and SHMFLG determine how
@@ -31,17 +28,19 @@
void *
shmat (int shmid, const void *shmaddr, int shmflg)
{
+#ifdef __ASSUME_SYSVIPC_SYSCALL
+ return INLINE_SYSCALL_CALL (shmat, shmid, shmaddr, shmflg);
+#else
INTERNAL_SYSCALL_DECL(err);
unsigned long resultvar;
void *raddr;
- resultvar = INTERNAL_SYSCALL (ipc, err, 5, IPCOP_shmat,
- shmid, shmflg,
- (long int) &raddr,
- (void *) shmaddr);
+ resultvar = INTERNAL_SYSCALL_CALL (ipc, err, IPCOP_shmat, shmid, shmflg,
+ &raddr, shmaddr);
if (INTERNAL_SYSCALL_ERROR_P (resultvar, err))
return (void *) INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (resultvar,
err));
return raddr;
+#endif
}