PERFORCE change 101964 for review
John Baldwin
jhb at FreeBSD.org
Wed Jul 19 21:11:49 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=101964
Change 101964 by jhb at jhb_mutex on 2006/07/19 21:11:08
- Move svr4_delete_socket() over to svr4_socket.c and make all the
svr4_sockcache_entry stuff (including svr4_head) private to
svr4_socket.c.
- Add a mutex to protect the svr4 socket cache.
Affected files ...
.. //depot/projects/smpng/sys/compat/svr4/svr4_socket.c#12 edit
.. //depot/projects/smpng/sys/compat/svr4/svr4_socket.h#7 edit
.. //depot/projects/smpng/sys/dev/streams/streams.c#29 edit
Differences ...
==== //depot/projects/smpng/sys/compat/svr4/svr4_socket.c#12 (text+ko) ====
@@ -47,6 +47,7 @@
#include <sys/systm.h>
#include <sys/queue.h>
#include <sys/file.h>
+#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/socket.h>
@@ -65,6 +66,20 @@
#include <compat/svr4/svr4_sockmod.h>
#include <compat/svr4/svr4_proto.h>
+struct svr4_sockcache_entry {
+ struct proc *p; /* Process for the socket */
+ void *cookie; /* Internal cookie used for matching */
+ struct sockaddr_un sock;/* Pathname for the socket */
+ dev_t dev; /* Device where the socket lives on */
+ ino_t ino; /* Inode where the socket lives on */
+ TAILQ_ENTRY(svr4_sockcache_entry) entries;
+};
+
+static TAILQ_HEAD(, svr4_sockcache_entry) svr4_head =
+ TAILQ_HEAD_INITIALIZER(svr4_head);
+static struct mtx svr4_head_lock;
+MTX_SYSINIT(svr4_head_lock, &svr4_head_lock, "svr4_head", MTX_DEF);
+
struct sockaddr_un *
svr4_find_socket(td, fp, dev, ino)
struct thread *td;
@@ -76,6 +91,7 @@
void *cookie = ((struct socket *)fp->f_data)->so_emuldata;
DPRINTF(("svr4_find_socket: [%p,%d,%d]: ", td, dev, ino));
+ mtx_lock(&svr4_head_lock);
TAILQ_FOREACH(e, &svr4_head, entries)
if (e->p == td->td_proc && e->dev == dev && e->ino == ino) {
#ifdef DIAGNOSTIC
@@ -84,18 +100,15 @@
#endif
e->cookie = cookie;
DPRINTF(("%s\n", e->sock.sun_path));
+ mtx_unlock(&svr4_head_lock);
return &e->sock;
}
+ mtx_unlock(&svr4_head_lock);
DPRINTF(("not found\n"));
return NULL;
}
-
-/*
- * svr4_delete_socket() is in sys/dev/streams.c (because it's called by
- * the streams "soo_close()" routine).
- */
int
svr4_add_socket(td, path, st)
struct thread *td;
@@ -105,8 +118,6 @@
struct svr4_sockcache_entry *e;
int len, error;
- mtx_lock(&Giant);
-
e = malloc(sizeof(*e), M_TEMP, M_WAITOK);
e->cookie = NULL;
e->dev = st->st_dev;
@@ -124,13 +135,34 @@
e->sock.sun_family = AF_LOCAL;
e->sock.sun_len = len;
+ mtx_lock(&svr4_head_lock);
TAILQ_INSERT_HEAD(&svr4_head, e, entries);
- mtx_unlock(&Giant);
+ mtx_unlock(&svr4_head_lock);
DPRINTF(("svr4_add_socket: %s [%p,%d,%d]\n", e->sock.sun_path,
td->td_proc, e->dev, e->ino));
return 0;
}
+void
+svr4_delete_socket(p, fp)
+ struct proc *p;
+ struct file *fp;
+{
+ struct svr4_sockcache_entry *e;
+ void *cookie = ((struct socket *)fp->f_data)->so_emuldata;
+
+ mtx_lock(&svr4_head_lock);
+ TAILQ_FOREACH(e, &svr4_head, entries)
+ if (e->p == p && e->cookie == cookie) {
+ TAILQ_REMOVE(&svr4_head, e, entries);
+ mtx_unlock(&svr4_head_lock);
+ DPRINTF(("svr4_delete_socket: %s [%p,%d,%d]\n",
+ e->sock.sun_path, p, (int)e->dev, e->ino));
+ free(e, M_TEMP);
+ return;
+ }
+ mtx_unlock(&svr4_head_lock);
+}
int
svr4_sys_socket(td, uap)
==== //depot/projects/smpng/sys/compat/svr4/svr4_socket.h#7 (text+ko) ====
@@ -53,17 +53,4 @@
void svr4_delete_socket(struct proc *, struct file *);
int svr4_add_socket(struct thread *, const char *, struct stat *);
-struct svr4_sockcache_entry {
- struct proc *p; /* Process for the socket */
- void *cookie; /* Internal cookie used for matching */
- struct sockaddr_un sock;/* Pathname for the socket */
- dev_t dev; /* Device where the socket lives on */
- ino_t ino; /* Inode where the socket lives on */
- TAILQ_ENTRY(svr4_sockcache_entry) entries;
-};
-
-TAILQ_HEAD(svr4_sockcache_head, svr4_sockcache_entry);
-extern struct svr4_sockcache_head svr4_head;
-extern int svr4_str_initialized;
-
#endif /* _SVR4_SOCKET_H_ */
==== //depot/projects/smpng/sys/dev/streams/streams.c#29 (text+ko) ====
@@ -68,8 +68,6 @@
static int svr4_ptm_alloc(struct thread *);
static d_open_t streamsopen;
-struct svr4_sockcache_head svr4_head;
-
/*
* Device minor numbers
*/
@@ -119,7 +117,6 @@
{
switch (type) {
case MOD_LOAD:
- TAILQ_INIT(&svr4_head);
dt_ptm = make_dev(&streams_cdevsw, dev_ptm, 0, 0, 0666,
"ptm");
dt_arp = make_dev(&streams_cdevsw, dev_arp, 0, 0, 0666,
@@ -371,24 +368,6 @@
return st;
}
-void
-svr4_delete_socket(p, fp)
- struct proc *p;
- struct file *fp;
-{
- struct svr4_sockcache_entry *e;
- void *cookie = ((struct socket *)fp->f_data)->so_emuldata;
-
- TAILQ_FOREACH(e, &svr4_head, entries)
- if (e->p == p && e->cookie == cookie) {
- TAILQ_REMOVE(&svr4_head, e, entries);
- DPRINTF(("svr4_delete_socket: %s [%p,%d,%d]\n",
- e->sock.sun_path, p, (int)e->dev, e->ino));
- free(e, M_TEMP);
- return;
- }
-}
-
static int
svr4_soo_close(struct file *fp, struct thread *td)
{
More information about the p4-projects
mailing list