summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2012-12-20 04:10:24 +0000
committerJakub Hrozek <jhrozek@redhat.com>2012-12-20 19:55:02 +0100
commitda4c23b6670adb45f71cf51aaeca8df30c2144be (patch)
tree1f3aa8b71171cc5f36b23a3d4c7ba54ba8dc0c56
parent8437e782fdf97945e9e0c2a793ffaf49abc2c0ca (diff)
downloadsssd-da4c23b6670adb45f71cf51aaeca8df30c2144be.tar.gz
sssd-da4c23b6670adb45f71cf51aaeca8df30c2144be.tar.xz
sssd-da4c23b6670adb45f71cf51aaeca8df30c2144be.zip
Update free table when records are invalidated.
We were holding up slots when entries were invalidated directly an not through our primitive garbage collection scheme.
-rw-r--r--src/responder/nss/nsssrv_mmap_cache.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/src/responder/nss/nsssrv_mmap_cache.c b/src/responder/nss/nsssrv_mmap_cache.c
index 2958bbac..4b561046 100644
--- a/src/responder/nss/nsssrv_mmap_cache.c
+++ b/src/responder/nss/nsssrv_mmap_cache.c
@@ -169,6 +169,19 @@ static void sss_mc_rm_rec_from_chain(struct sss_mc_ctx *mcc,
}
}
+static void sss_mc_free_slots(struct sss_mc_ctx *mcc, struct sss_mc_rec *rec)
+{
+ uint32_t slot;
+ uint32_t num;
+ uint32_t i;
+
+ slot = MC_PTR_TO_SLOT(mcc->data_table, rec);
+ num = MC_SIZE_TO_SLOTS(rec->len);
+ for (i = 0; i < num; i++) {
+ MC_CLEAR_BIT(mcc->free_table, slot + i);
+ }
+}
+
static void sss_mc_invalidate_rec(struct sss_mc_ctx *mcc,
struct sss_mc_rec *rec)
{
@@ -177,13 +190,18 @@ static void sss_mc_invalidate_rec(struct sss_mc_ctx *mcc,
return;
}
+ /* Remove from hash chains */
/* hash chain 1 */
sss_mc_rm_rec_from_chain(mcc, rec, rec->hash1);
/* hash chain 2 */
sss_mc_rm_rec_from_chain(mcc, rec, rec->hash2);
+ /* Clear from free_table */
+ sss_mc_free_slots(mcc, rec);
+
+ /* Invalidate record fields */
MC_RAISE_INVALID_BARRIER(rec);
- memset(rec->data, 'X', rec->len - sizeof(struct sss_mc_rec));
+ memset(rec->data, 0xff, rec->len - sizeof(struct sss_mc_rec));
rec->len = MC_INVALID_VAL;
rec->expire = (uint64_t)-1;
rec->next = MC_INVALID_VAL;
@@ -206,7 +224,7 @@ static int sss_mc_find_free_slots(struct sss_mc_ctx *mcc, int num_slots)
tot_slots = mcc->ft_size * 8;
- /* Try to find a free slot w/o removing a nything first */
+ /* Try to find a free slot w/o removing anything first */
/* FIXME: is it really worth it ? May be it is easier to
* just recycle the next set of slots ? */
if ((mcc->next_slot + num_slots) > tot_slots) {
@@ -259,13 +277,10 @@ static int sss_mc_find_free_slots(struct sss_mc_ctx *mcc, int num_slots)
}
for (i = 0; i < num_slots; i++) {
MC_PROBE_BIT(mcc->free_table, cur + i, used);
- if (!used) continue;
-
- rec = MC_SLOT_TO_PTR(mcc->data_table, cur + i, struct sss_mc_rec);
- for (t = i + MC_SIZE_TO_SLOTS(rec->len); i < t; i++) {
- MC_CLEAR_BIT(mcc->free_table, cur + i);
+ if (used) {
+ rec = MC_SLOT_TO_PTR(mcc->data_table, cur + i, struct sss_mc_rec);
+ sss_mc_invalidate_rec(mcc, rec);
}
- sss_mc_invalidate_rec(mcc, rec);
}
mcc->next_slot = cur + num_slots;
@@ -330,13 +345,7 @@ static struct sss_mc_rec *sss_mc_get_record(struct sss_mc_ctx *mcc,
/* slot size changed, invalidate record and fall through to get a
* fully new record */
- base_slot = MC_PTR_TO_SLOT(mcc->data_table, old_rec);
sss_mc_invalidate_rec(mcc, old_rec);
-
- /* and now free slots */
- for (i = 0; i < old_slots; i++) {
- MC_CLEAR_BIT(mcc->free_table, base_slot + i);
- }
}
/* we are going to use more space, find enough free slots */