Пример #1
0
static void dlm_run_purge_list(struct dlm_ctxt *dlm,
			       int purge_now)
{
	unsigned int run_max, unused;
	unsigned long purge_jiffies;
	struct dlm_lock_resource *lockres;

	spin_lock(&dlm->spinlock);
	run_max = dlm->purge_count;

	while(run_max && !list_empty(&dlm->purge_list)) {
		run_max--;

		lockres = list_entry(dlm->purge_list.next,
				     struct dlm_lock_resource, purge);

		spin_lock(&lockres->spinlock);

		purge_jiffies = lockres->last_used +
			msecs_to_jiffies(DLM_PURGE_INTERVAL_MS);

		/* Make sure that we want to be processing this guy at
		 * this time. */
		if (!purge_now && time_after(purge_jiffies, jiffies)) {
			/* Since resources are added to the purge list
			 * in tail order, we can stop at the first
			 * unpurgable resource -- anyone added after
			 * him will have a greater last_used value */
			spin_unlock(&lockres->spinlock);
			break;
		}

		/* Status of the lockres *might* change so double
		 * check. If the lockres is unused, holding the dlm
		 * spinlock will prevent people from getting and more
		 * refs on it. */
		unused = __dlm_lockres_unused(lockres);
		if (!unused ||
		    (lockres->state & DLM_LOCK_RES_MIGRATING)) {
			mlog(0, "lockres %s:%.*s: is in use or "
			     "being remastered, used %d, state %d\n",
			     dlm->name, lockres->lockname.len,
			     lockres->lockname.name, !unused, lockres->state);
			list_move_tail(&dlm->purge_list, &lockres->purge);
			spin_unlock(&lockres->spinlock);
			continue;
		}

		dlm_lockres_get(lockres);

		dlm_purge_lockres(dlm, lockres);

		dlm_lockres_put(lockres);

		/* Avoid adding any scheduling latencies */
		cond_resched_lock(&dlm->spinlock);
	}

	spin_unlock(&dlm->spinlock);
}
Пример #2
0
static void dlm_run_purge_list(struct dlm_ctxt *dlm,
                               int purge_now)
{
    unsigned int run_max, unused;
    unsigned long purge_jiffies;
    struct dlm_lock_resource *lockres;

    spin_lock(&dlm->spinlock);
    run_max = dlm->purge_count;

    while(run_max && !list_empty(&dlm->purge_list)) {
        run_max--;

        lockres = list_entry(dlm->purge_list.next,
                             struct dlm_lock_resource, purge);

        /* Status of the lockres *might* change so double
         * check. If the lockres is unused, holding the dlm
         * spinlock will prevent people from getting and more
         * refs on it -- there's no need to keep the lockres
         * spinlock. */
        spin_lock(&lockres->spinlock);
        unused = __dlm_lockres_unused(lockres);
        spin_unlock(&lockres->spinlock);

        if (!unused)
            continue;

        purge_jiffies = lockres->last_used +
                        msecs_to_jiffies(DLM_PURGE_INTERVAL_MS);

        /* Make sure that we want to be processing this guy at
         * this time. */
        if (!purge_now && time_after(purge_jiffies, jiffies)) {
            /* Since resources are added to the purge list
             * in tail order, we can stop at the first
             * unpurgable resource -- anyone added after
             * him will have a greater last_used value */
            break;
        }

        list_del_init(&lockres->purge);
        dlm->purge_count--;

        /* This may drop and reacquire the dlm spinlock if it
         * has to do migration. */
        mlog(0, "calling dlm_purge_lockres!\n");
        dlm_purge_lockres(dlm, lockres);
        mlog(0, "DONE calling dlm_purge_lockres!\n");

        /* Avoid adding any scheduling latencies */
        cond_resched_lock(&dlm->spinlock);
    }

    spin_unlock(&dlm->spinlock);
}
static void dlm_run_purge_list(struct dlm_ctxt *dlm,
			       int purge_now)
{
	unsigned int run_max, unused;
	unsigned long purge_jiffies;
	struct dlm_lock_resource *lockres;

	spin_lock(&dlm->spinlock);
	run_max = dlm->purge_count;

	while(run_max && !list_empty(&dlm->purge_list)) {
		run_max--;

		lockres = list_entry(dlm->purge_list.next,
				     struct dlm_lock_resource, purge);

		spin_lock(&lockres->spinlock);

		purge_jiffies = lockres->last_used +
			msecs_to_jiffies(DLM_PURGE_INTERVAL_MS);

		if (!purge_now && time_after(purge_jiffies, jiffies)) {
			spin_unlock(&lockres->spinlock);
			break;
		}

		unused = __dlm_lockres_unused(lockres);
		if (!unused ||
		    (lockres->state & DLM_LOCK_RES_MIGRATING)) {
			mlog(0, "%s: res %.*s is in use or being remastered, "
			     "used %d, state %d\n", dlm->name,
			     lockres->lockname.len, lockres->lockname.name,
			     !unused, lockres->state);
			list_move_tail(&dlm->purge_list, &lockres->purge);
			spin_unlock(&lockres->spinlock);
			continue;
		}

		dlm_lockres_get(lockres);

		dlm_purge_lockres(dlm, lockres);

		dlm_lockres_put(lockres);

		
		cond_resched_lock(&dlm->spinlock);
	}

	spin_unlock(&dlm->spinlock);
}