summaryrefslogtreecommitdiffstats
path: root/src/responder
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:59:43 +0100
commit884c92c83c3d4cdde5cff74fa19f710429532b81 (patch)
tree3d72eb52160df57e232e25dfcb0b22d2f075956d /src/responder
parent26ae48f771f9e94bbc151451a064e3b7281ad106 (diff)
downloadsssd-884c92c83c3d4cdde5cff74fa19f710429532b81.tar.gz
sssd-884c92c83c3d4cdde5cff74fa19f710429532b81.tar.xz
sssd-884c92c83c3d4cdde5cff74fa19f710429532b81.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.
Diffstat (limited to 'src/responder')
-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 644c15747..1ef38de23 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 */