From af89dba044ffbefe18d1a164aad48128098b04f9 Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Thu, 14 Mar 2019 13:44:16 +0100 Subject: [PATCH] infra: prepare simplification of flags --- kernel/mars.h | 19 ++++++++++++++----- kernel/mars_buf.c | 14 +++++++------- kernel/mars_buf.h | 2 +- kernel/mars_generic.c | 2 +- kernel/mars_usebuf.c | 4 +--- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/kernel/mars.h b/kernel/mars.h index bbb9efd4..50700e53 100644 --- a/kernel/mars.h +++ b/kernel/mars.h @@ -121,10 +121,6 @@ /* mref */ -#define MREF_UPTODATE 1 -#define MREF_READING 2 -#define MREF_WRITING 4 - extern const struct generic_object_type mref_type; #ifdef MARS_TRACING @@ -151,6 +147,18 @@ extern void mars_log_trace(struct mref_object *mref); #define mars_log_trace(mref) /*empty*/ #endif +enum _MREF_FLAGS { + /* New flags must always be appended */ + /* Never change the position of an existing flag */ + _MREF_UPTODATE, + _MREF_READING, + _MREF_WRITING, +}; + +#define MREF_UPTODATE (1UL << _MREF_UPTODATE) +#define MREF_READING (1UL << _MREF_READING) +#define MREF_WRITING (1UL << _MREF_WRITING) + #define MREF_OBJECT(OBJTYPE) \ CALLBACK_OBJECT(OBJTYPE); \ /* supplied by caller */ \ @@ -161,10 +169,11 @@ extern void mars_log_trace(struct mref_object *mref); int ref_prio; \ int ref_timeout; \ int ref_cs_mode; /* 0 = off, 1 = checksum + data, 2 = checksum only */ \ + /* shared */ \ + __u32 ref_flags; \ /* maintained by the ref implementation, readable for callers */ \ loff_t ref_total_size; /* just for info, need not be implemented */ \ unsigned char ref_checksum[16]; \ - int ref_flags; \ int ref_rw; \ int ref_id; /* not mandatory; may be used for identification */ \ bool ref_skip_sync; /* skip sync for this particular mref */ \ diff --git a/kernel/mars_buf.c b/kernel/mars_buf.c index 727473b4..6f6e64a1 100644 --- a/kernel/mars_buf.c +++ b/kernel/mars_buf.c @@ -551,7 +551,7 @@ again: _mref_assign(bf, mref_a); - MARS_DBG("bf=%p index = %lld flags = %d\n", bf, bf->bf_base_index, bf->bf_flags); + MARS_DBG("bf=%p index = %lld flags = %x\n", bf, bf->bf_base_index, bf->bf_flags); mref->ref_flags = bf->bf_flags; mref->ref_data = bf->bf_data + base_offset; @@ -583,7 +583,7 @@ static void _buf_ref_put(struct buf_output *output, struct buf_mref_aspect *mref if (!_mref_put(mref)) return; - MARS_DBG("buf_ref_put() mref=%p mref_a=%p bf=%p flags=%d\n", mref, mref_a, bf, bf->bf_flags); + MARS_DBG("buf_ref_put() mref=%p mref_a=%p bf=%p flags=%x\n", mref, mref_a, bf, bf->bf_flags); _mref_remove(bf, mref_a); buf_free_mref(mref); @@ -629,7 +629,7 @@ static int _buf_make_io(struct buf_brick *brick, struct buf_head *bf, void *star } #endif - MARS_DBG("bf = %p rw = %d start = %lld len = %d flags = %d\n", bf, rw, start_pos, start_len, bf->bf_flags); + MARS_DBG("bf = %p rw = %d start = %lld len = %d flags = %x\n", bf, rw, start_pos, start_len, bf->bf_flags); atomic_set(&bf->bf_io_count, 0); status = -ENOMEM; @@ -700,7 +700,7 @@ static void _buf_endio(struct generic_callback *cb) struct buf_head *bf; struct buf_brick *brick; LIST_HEAD(tmp); - int old_flags; + __u32 old_flags; unsigned long flags; void *start_data = NULL; loff_t start_pos = 0; @@ -719,7 +719,7 @@ static void _buf_endio(struct generic_callback *cb) brick = bf->bf_brick; CHECK_PTR(brick, err); - MARS_DBG("_buf_endio() bf_mref_a=%p bf_mref=%p bf=%p flags=%d\n", bf_mref_a, bf_mref, bf, bf->bf_flags); + MARS_DBG("_buf_endio() bf_mref_a=%p bf_mref=%p bf=%p flags=%x\n", bf_mref_a, bf_mref, bf, bf->bf_flags); if (error < 0) bf->bf_error = error; @@ -886,7 +886,7 @@ static void buf_ref_io(struct buf_output *output, struct mref_object *mref) _mref_get(mref); CHECK_ATOMIC(&bf->bf_hash_count, 1); - MARS_DBG("IO mref=%p rw=%d bf=%p flags=%d\n", mref, mref->ref_rw, bf, bf->bf_flags); + MARS_DBG("IO mref=%p rw=%d bf=%p flags=%x\n", mref, mref->ref_rw, bf, bf->bf_flags); if (mref->ref_rw != READ) { loff_t end; @@ -926,7 +926,7 @@ static void buf_ref_io(struct buf_output *output, struct mref_object *mref) goto already_done; #endif if (bf->bf_flags & MREF_READING) { - MARS_ERR("bad bf_flags %d\n", bf->bf_flags); + MARS_ERR("bad bf_flags %x\n", bf->bf_flags); } if (!(bf->bf_flags & MREF_WRITING)) { #if 0 diff --git a/kernel/mars_buf.h b/kernel/mars_buf.h index 19c7e25f..0916ed3a 100644 --- a/kernel/mars_buf.h +++ b/kernel/mars_buf.h @@ -98,7 +98,7 @@ struct buf_head { struct buf_brick *bf_brick; loff_t bf_pos; loff_t bf_base_index; - int bf_flags; + __u32 bf_flags; int bf_error; atomic_t bf_hash_count; // # references pinning the hash atomic_t bf_mref_count; // # mrefs (only used for checking, no real semantics) diff --git a/kernel/mars_generic.c b/kernel/mars_generic.c index 32824412..29e6fdd1 100644 --- a/kernel/mars_generic.c +++ b/kernel/mars_generic.c @@ -106,7 +106,7 @@ const struct meta mars_mref_meta[] = { META_INI(ref_timeout, struct mref_object, FIELD_INT), META_INI(ref_total_size, struct mref_object, FIELD_INT), META_INI(ref_checksum, struct mref_object, FIELD_INT), - META_INI(ref_flags, struct mref_object, FIELD_INT), + META_INI(ref_flags, struct mref_object, FIELD_UINT), META_INI(ref_rw, struct mref_object, FIELD_INT), META_INI(ref_id, struct mref_object, FIELD_INT), META_INI(ref_skip_sync, struct mref_object, FIELD_INT), diff --git a/kernel/mars_usebuf.c b/kernel/mars_usebuf.c index 72bfd5ed..78c8aa94 100644 --- a/kernel/mars_usebuf.c +++ b/kernel/mars_usebuf.c @@ -88,8 +88,6 @@ static void _usebuf_endio(struct generic_callback *cb) sub_mref = sub_mref_a->object; CHECK_PTR(sub_mref, done); - //MARS_INF("HALLO %p %p len = %d may_write = %d rw = %d flags = %d\n", mref, sub_mref, sub_mref->ref_len, sub_mref->ref_may_write, sub_mref->ref_rw, sub_mref->ref_flags); - if (mref->ref_data != sub_mref->ref_data && cb->cb_error >= 0) { if (sub_mref->ref_may_write == 0) { if (sub_mref->ref_flags & MREF_UPTODATE) { @@ -183,7 +181,7 @@ static int usebuf_ref_get(struct usebuf_output *output, struct mref_object *mref } mref->ref_len = sub_mref->ref_len; - //MARS_INF("GOT %p %p flags = %d\n", mref, sub_mref, sub_mref->ref_flags); + //MARS_INF("GOT %p %p flags = %x\n", mref, sub_mref, sub_mref->ref_flags); if (!mref->ref_data) { MARS_INF("uiiiiiiiiiii\n"); mref->ref_data = sub_mref->ref_data;