2.6.27+ portability changes

- Added SPL_AC_3ARGS_ON_EACH_CPU configure check to determine
  if the older 4 argument version of on_each_cpu() should be
  used or the new 3 argument version.  The retry argument was
  dropped in the new API which was never used anyway.
- Updated work queue compatibility wrappers.  The old way this
  worked was to pass a data point when initialized the workqueue.
  The new API assumed the work item is embedding in a structure
  and we us container_of() to find that data pointer.
- Updated skc->skc_flags to be an unsigned long which is now
  type checked in the bit operations.  This silences the warnings.
- Updated autogen products and splat tests accordingly
This commit is contained in:
Brian Behlendorf
2009-02-02 15:12:30 -08:00
parent f220894e1f
commit 31a033ecd4
11 changed files with 139 additions and 75 deletions
+8 -15
View File
@@ -59,28 +59,26 @@ typedef struct mutex_priv {
int mp_rc;
} mutex_priv_t;
#ifdef HAVE_3ARGS_INIT_WORK
static void
splat_mutex_test1_work(void *priv)
{
mutex_priv_t *mp = (mutex_priv_t *)priv;
mutex_priv_t *mp;
mp = spl_get_work_data(priv, mutex_priv_t, mp_work.work);
ASSERT(mp->mp_magic == SPLAT_MUTEX_TEST_MAGIC);
mp->mp_rc = 0;
if (!mutex_tryenter(&mp->mp_mtx))
mp->mp_rc = -EBUSY;
}
#endif
static int
splat_mutex_test1(struct file *file, void *arg)
{
int rc = 0;
#ifdef HAVE_3ARGS_INIT_WORK
struct workqueue_struct *wq;
struct work_struct work;
mutex_priv_t *mp;
int rc = 0;
mp = (mutex_priv_t *)kmalloc(sizeof(*mp), GFP_KERNEL);
if (mp == NULL)
@@ -97,7 +95,7 @@ splat_mutex_test1(struct file *file, void *arg)
mp->mp_magic = SPLAT_MUTEX_TEST_MAGIC;
mp->mp_file = file;
INIT_WORK(&work, splat_mutex_test1_work, mp);
spl_init_work(&work, splat_mutex_test1_work, mp);
/* Schedule a work item which will try and aquire the mutex via
* mutex_tryenter() while its held. This should fail and the work
@@ -143,17 +141,16 @@ out:
destroy_workqueue(wq);
out2:
kfree(mp);
#endif
return rc;
}
#ifdef HAVE_3ARGS_INIT_WORK
static void
splat_mutex_test2_work(void *priv)
{
mutex_priv_t *mp = (mutex_priv_t *)priv;
mutex_priv_t *mp;
int rc;
mp = spl_get_work_data(priv, mutex_priv_t, mp_work.work);
ASSERT(mp->mp_magic == SPLAT_MUTEX_TEST_MAGIC);
/* Read the value before sleeping and write it after we wake up to
@@ -165,16 +162,13 @@ splat_mutex_test2_work(void *priv)
mp->mp_rc = rc + 1;
mutex_exit(&mp->mp_mtx);
}
#endif
static int
splat_mutex_test2(struct file *file, void *arg)
{
int rc = 0;
#ifdef HAVE_3ARGS_INIT_WORK
struct workqueue_struct *wq;
mutex_priv_t *mp;
int i;
int i, rc = 0;
mp = (mutex_priv_t *)kmalloc(sizeof(*mp), GFP_KERNEL);
if (mp == NULL)
@@ -200,7 +194,7 @@ splat_mutex_test2(struct file *file, void *arg)
* critical region at the same time the system will panic. If the
* mutex is implemented right this will never happy, that's a pass. */
for (i = 0; i < SPLAT_MUTEX_TEST_COUNT; i++) {
INIT_WORK(&(mp->mp_work[i]), splat_mutex_test2_work, mp);
spl_init_work(&(mp->mp_work[i]), splat_mutex_test2_work, mp);
if (!queue_work(wq, &(mp->mp_work[i]))) {
splat_vprint(file, SPLAT_MUTEX_TEST2_NAME,
@@ -226,7 +220,6 @@ splat_mutex_test2(struct file *file, void *arg)
destroy_workqueue(wq);
out:
kfree(mp);
#endif
return rc;
}