Index: depot/user/kan/buflock/i386/include/atomic.h =========================================================================== --- i386/include/atomic.h 2003/08/31 01:51:04 #10 +++ depot/user/kan/buflock/i386/include/atomic.h 2003/08/31 01:51:04 @@ -67,6 +67,9 @@ #define ATOMIC_ASM(NAME, TYPE, OP, CONS, V) \ void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v) +#define ATOMIC_ASM_TEST(NAME, TYPE, OP, CONS, V) \ +int atomic_##NAME##_test_##TYPE(volatile u_##TYPE *p, u_##TYPE v) + int atomic_cmpset_int(volatile u_int *dst, u_int exp, u_int src); #define ATOMIC_STORE_LOAD(TYPE, LOP, SOP) \ @@ -100,11 +103,25 @@ : CONS (V)); \ } +#define ATOMIC_ASM_TEST(NAME, TYPE, OP, CONS, V) \ +static __inline int \ +atomic_##NAME##_test_##TYPE(volatile u_##TYPE *p, u_##TYPE v) \ +{ \ + unsigned char r; \ + __asm __volatile(__XSTRING(MPLOCKED) OP "; sete %1" \ + : "+m" (*p), "=qm" (r) \ + : CONS (V)); \ + return r; \ +} + #else /* !__GNUC__ */ #define ATOMIC_ASM(NAME, TYPE, OP, CONS, V) \ extern void atomic_##NAME##_##TYPE(volatile u_##TYPE *p, u_##TYPE v) +#define ATOMIC_ASM_TEST(NAME, TYPE, OP, CONS, V) \ +extern int atomic_##NAME##_test_##TYPE(volatile u_##TYPE *p, u_##TYPE v) + #endif /* __GNUC__ */ /* @@ -255,6 +272,15 @@ ATOMIC_ASM(add, long, "addl %1,%0", "ir", v); ATOMIC_ASM(subtract, long, "subl %1,%0", "ir", v); +ATOMIC_ASM_TEST(add, char, "addb %b2,%0", "iq", v); +ATOMIC_ASM_TEST(subtract, char, "subb %b2,%0", "iq", v); +ATOMIC_ASM_TEST(add, short, "addw %w2,%0", "ir", v); +ATOMIC_ASM_TEST(subtract, short, "subw %w2,%0", "ir", v); +ATOMIC_ASM_TEST(add, long, "addl %2,%0", "ir", v); +ATOMIC_ASM_TEST(subtract, long, "subl %2,%0", "ir", v); +ATOMIC_ASM_TEST(add, int, "addl %2,%0", "ir", v); +ATOMIC_ASM_TEST(subtract, int, "subl %2,%0", "ir", v); + ATOMIC_STORE_LOAD(char, "cmpxchgb %b0,%1", "xchgb %b1,%0"); ATOMIC_STORE_LOAD(short,"cmpxchgw %w0,%1", "xchgw %w1,%0"); ATOMIC_STORE_LOAD(int, "cmpxchgl %0,%1", "xchgl %1,%0"); Index: depot/user/kan/buflock/kern/vfs_bio.c =========================================================================== --- kern/vfs_bio.c 2003/08/31 01:51:04 #118 +++ depot/user/kan/buflock/kern/vfs_bio.c 2003/08/31 01:51:04 @@ -26,7 +26,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/kern/vfs_bio.c,v 1.402 2003/08/31 01:07:45 jeff Exp $"); +__FBSDID("$FreeBSD: src/sys/kern/vfs_bio.c,v 1.400 2003/08/28 19:58:11 marcel Exp $"); #include #include @@ -1196,6 +1196,11 @@ KASSERT(!(bp->b_flags & (B_CLUSTER|B_PAGING)), ("brelse: inappropriate B_PAGING or B_CLUSTER bp %p", bp)); + if (bp->b_flags & B_MANAGED) { + bqrelse(bp); + return; + } + s = splbio(); if (bp->b_iocmd == BIO_WRITE && @@ -1480,7 +1482,7 @@ if (bp->b_qindex != QUEUE_NONE) panic("bqrelse: free buffer onto another queue???"); - if (BUF_REFCNT(bp) > 1) { + if (BUF_REFCNT(bp) > 1 || bp->b_flags & B_MANAGED) { /* do not release to free list */ BUF_UNLOCK(bp); splx(s); Index: depot/user/kan/buflock/sys/bio.h =========================================================================== --- sys/bio.h 2003/08/31 01:51:04 #27 +++ depot/user/kan/buflock/sys/bio.h 2003/08/31 01:51:04 @@ -68,6 +68,7 @@ void *bio_driver2; /* Private use by the callee. */ void *bio_caller1; /* Private use by the caller. */ void *bio_caller2; /* Private use by the caller. */ + void *bio_caller3; /* Private use by the caller. */ TAILQ_ENTRY(bio) bio_queue; /* Disksort queue. */ const char *bio_attribute; /* Attribute for BIO_[GS]ETATTR */ struct g_consumer *bio_from; /* GEOM linkage */ Index: depot/user/kan/buflock/sys/buf.h =========================================================================== --- sys/buf.h 2003/08/31 01:51:04 #38 +++ depot/user/kan/buflock/sys/buf.h 2003/08/31 01:51:04 @@ -107,6 +107,7 @@ #define b_blkno b_io.bio_blkno #define b_caller1 b_io.bio_caller1 #define b_caller2 b_io.bio_caller2 +#define b_caller3 b_io.bio_caller3 #define b_data b_io.bio_data #define b_dev b_io.bio_dev #define b_driver1 b_io.bio_driver1 @@ -214,7 +215,7 @@ #define B_00000100 0x00000100 /* Available flag. */ #define B_DONE 0x00000200 /* I/O completed. */ #define B_EINTR 0x00000400 /* I/O was interrupted */ -#define B_00000800 0x00000800 /* Availabel flag. */ +#define B_00000800 0x00000800 /* Available flag. */ #define B_00001000 0x00001000 /* Available flag. */ #define B_INVAL 0x00002000 /* Does not contain valid info. */ #define B_00004000 0x00004000 /* Available flag. */ @@ -234,7 +235,7 @@ #define B_RAM 0x10000000 /* Read ahead mark (flag) */ #define B_VMIO 0x20000000 /* VMIO flag */ #define B_CLUSTER 0x40000000 /* pagein op, so swap() can count it */ -#define B_80000000 0x80000000 /* Available flag. */ +#define B_MANAGED 0x80000000 /* Managed by FS. */ #define PRINT_BUF_FLAGS "\20\40b31\37cluster\36vmio\35ram\34b27" \ "\33paging\32b25\31writeinprog\30b23\27relbuf\26dirty\25b20" \ Index: depot/user/kan/buflock/sys/mount.h =========================================================================== --- sys/mount.h 2003/08/31 01:51:04 #38 +++ depot/user/kan/buflock/sys/mount.h 2003/08/31 01:51:04 @@ -52,7 +52,7 @@ * File identifier. * These are unique per filesystem on a single machine. */ -#define MAXFIDSZ 16 +#define MAXFIDSZ 46 struct fid { u_short fid_len; /* length of data in bytes */