mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Create package msgqueue.
Create package msgqueue, define primitives to be used for message queues, and add a msgqueue.Registry to IPCNamespace. Updates #135
This commit is contained in:
@@ -256,6 +256,7 @@ go_library(
|
||||
"//pkg/sentry/kernel/auth",
|
||||
"//pkg/sentry/kernel/epoll",
|
||||
"//pkg/sentry/kernel/futex",
|
||||
"//pkg/sentry/kernel/msgqueue",
|
||||
"//pkg/sentry/kernel/sched",
|
||||
"//pkg/sentry/kernel/semaphore",
|
||||
"//pkg/sentry/kernel/shm",
|
||||
|
||||
@@ -17,6 +17,7 @@ package kernel
|
||||
import (
|
||||
"gvisor.dev/gvisor/pkg/context"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/auth"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/msgqueue"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/semaphore"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/shm"
|
||||
)
|
||||
@@ -30,6 +31,7 @@ type IPCNamespace struct {
|
||||
// User namespace which owns this IPC namespace. Immutable.
|
||||
userNS *auth.UserNamespace
|
||||
|
||||
queues *msgqueue.Registry
|
||||
semaphores *semaphore.Registry
|
||||
shms *shm.Registry
|
||||
}
|
||||
@@ -38,6 +40,7 @@ type IPCNamespace struct {
|
||||
func NewIPCNamespace(userNS *auth.UserNamespace) *IPCNamespace {
|
||||
ns := &IPCNamespace{
|
||||
userNS: userNS,
|
||||
queues: msgqueue.NewRegistry(userNS),
|
||||
semaphores: semaphore.NewRegistry(userNS),
|
||||
shms: shm.NewRegistry(userNS),
|
||||
}
|
||||
@@ -45,6 +48,11 @@ func NewIPCNamespace(userNS *auth.UserNamespace) *IPCNamespace {
|
||||
return ns
|
||||
}
|
||||
|
||||
// MsgqueueRegistry returns the message queue registry for this namespace.
|
||||
func (i *IPCNamespace) MsgqueueRegistry() *msgqueue.Registry {
|
||||
return i.queues
|
||||
}
|
||||
|
||||
// SemaphoreRegistry returns the semaphore set registry for this namespace.
|
||||
func (i *IPCNamespace) SemaphoreRegistry() *semaphore.Registry {
|
||||
return i.semaphores
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
load("//tools:defs.bzl", "go_library")
|
||||
load("//tools/go_generics:defs.bzl", "go_template_instance")
|
||||
|
||||
package(licenses = ["notice"])
|
||||
|
||||
go_template_instance(
|
||||
name = "message_list",
|
||||
out = "message_list.go",
|
||||
package = "msgqueue",
|
||||
prefix = "msg",
|
||||
template = "//pkg/ilist:generic_list",
|
||||
types = {
|
||||
"Element": "*Message",
|
||||
"Linker": "*Message",
|
||||
},
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "msgqueue",
|
||||
srcs = [
|
||||
"msgqueue.go",
|
||||
"message_list.go",
|
||||
],
|
||||
visibility = ["//pkg/sentry:internal"],
|
||||
deps = [
|
||||
"//pkg/sentry/kernel/auth",
|
||||
"//pkg/sentry/kernel/ipc",
|
||||
"//pkg/sentry/kernel/time",
|
||||
"//pkg/waiter",
|
||||
"//pkg/sync",
|
||||
],
|
||||
)
|
||||
@@ -0,0 +1,111 @@
|
||||
// Copyright 2021 The gVisor Authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Package msgqueue implements System V message queues.
|
||||
package msgqueue
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/auth"
|
||||
"gvisor.dev/gvisor/pkg/sentry/kernel/ipc"
|
||||
ktime "gvisor.dev/gvisor/pkg/sentry/kernel/time"
|
||||
"gvisor.dev/gvisor/pkg/waiter"
|
||||
)
|
||||
|
||||
// Registry contains a set of message queues that can be referenced using keys
|
||||
// or IDs.
|
||||
//
|
||||
// +stateify savable
|
||||
type Registry struct {
|
||||
// mu protects all the fields below.
|
||||
mu sync.Mutex `state:"nosave"`
|
||||
|
||||
// reg defines basic fields and operations needed for all SysV registries.
|
||||
reg *ipc.Registry
|
||||
}
|
||||
|
||||
// Queue represents a SysV message queue, described by sysvipc(7).
|
||||
//
|
||||
// +stateify savable
|
||||
type Queue struct {
|
||||
// registry is the registry owning this queue. Immutable.
|
||||
registry *Registry
|
||||
|
||||
// mu protects all the fields below.
|
||||
mu sync.Mutex `state:"nosave"`
|
||||
|
||||
// obj defines basic fields that should be included in all SysV IPC objects.
|
||||
obj *ipc.Object
|
||||
|
||||
// senders holds a queue of blocked message senders. Senders are notified
|
||||
// when enough space is available in the queue to insert their message.
|
||||
senders waiter.Queue
|
||||
|
||||
// receivers holds a queue of blocked receivers. Receivers are notified
|
||||
// when a new message is inserted into the queue and can be received.
|
||||
receivers waiter.Queue
|
||||
|
||||
// messages is a list of sent messages.
|
||||
messages msgList
|
||||
|
||||
// sendTime is the last time a msgsnd was perfomed.
|
||||
sendTime ktime.Time
|
||||
|
||||
// receiveTime is the last time a msgrcv was performed.
|
||||
receiveTime ktime.Time
|
||||
|
||||
// changeTime is the last time the queue was modified using msgctl.
|
||||
changeTime ktime.Time
|
||||
|
||||
// byteCount is the current number of message bytes in the queue.
|
||||
byteCount uint64
|
||||
|
||||
// messageCount is the current number of messages in the queue.
|
||||
messageCount uint64
|
||||
|
||||
// maxBytes is the maximum allowed number of bytes in the queue, and is also
|
||||
// used as a limit for the number of total possible messages.
|
||||
maxBytes uint64
|
||||
|
||||
// sendPID is the PID of the process that performed the last msgsnd.
|
||||
sendPID int32
|
||||
|
||||
// receivePID is the PID of the process that performed the last msgrcv.
|
||||
receivePID int32
|
||||
}
|
||||
|
||||
// Message represents a message exchanged through a Queue via msgsnd(2) and
|
||||
// msgrcv(2).
|
||||
//
|
||||
// +stateify savable
|
||||
type Message struct {
|
||||
msgEntry
|
||||
|
||||
// mType is an integer representing the type of the sent message.
|
||||
mType int64
|
||||
|
||||
// mText is an untyped block of memory.
|
||||
mText []byte
|
||||
|
||||
// mSize is the size of mText.
|
||||
mSize uint64
|
||||
}
|
||||
|
||||
// NewRegistry returns a new Registry ready to be used.
|
||||
func NewRegistry(userNS *auth.UserNamespace) *Registry {
|
||||
return &Registry{
|
||||
reg: ipc.NewRegistry(userNS),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user