linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Staging: memrar: Moved memrar_allocator struct into memrar_allocator.c
@ 2010-06-14 12:40 Henri Häkkinen
  2010-06-23 17:51 ` Othman, Ossama
  2010-06-23 22:17 ` Greg KH
  0 siblings, 2 replies; 7+ messages in thread
From: Henri Häkkinen @ 2010-06-14 12:40 UTC (permalink / raw)
  To: gregkh, ossama.othman, henuxd, randy.dunlap, alan; +Cc: devel, linux-kernel

Forward declared memrar_allocator in memrar_allocator.h and moved it
to memrar_allocator.c file.  Implemented memrar_allocator_capacity(),
memrar_allocator_largest_free_area(), memrar_allocoator_lock() and
memrar_allocator_unlock().

Signed-off-by: Henri Häkkinen <henuxd@gmail.com>
---
 drivers/staging/memrar/memrar_allocator.c |   56 ++++++++++++++++++++++++
 drivers/staging/memrar/memrar_allocator.h |   66 ++++++++++++++++------------
 drivers/staging/memrar/memrar_handler.c   |   11 +++--
 3 files changed, 100 insertions(+), 33 deletions(-)

diff --git a/drivers/staging/memrar/memrar_allocator.c b/drivers/staging/memrar/memrar_allocator.c
index a4f8c58..955d1eb 100644
--- a/drivers/staging/memrar/memrar_allocator.c
+++ b/drivers/staging/memrar/memrar_allocator.c
@@ -41,6 +41,36 @@
 #include <linux/kernel.h>
 
 
+/**
+ * struct memrar_allocator - encapsulation of the memory allocator state
+ * @lock:		Lock used to synchronize access to the memory
+ *			allocator state.
+ * @base:		Base (start) address of the allocator memory
+ *			space.
+ * @capacity:		Size of the allocator memory space in bytes.
+ * @block_size:		The size in bytes of individual blocks within
+ *			the allocator memory space.
+ * @largest_free_area:	Largest free area of memory in the allocator
+ *			in bytes.
+ * @allocated_list:	List of allocated memory block address
+ *			ranges.
+ * @free_list:		List of free address ranges.
+ *
+ * This structure contains all memory allocator state, including the
+ * base address, capacity, free list, lock, etc.
+ */
+struct memrar_allocator {
+/* private: internal use only */
+	struct mutex lock;
+	unsigned long base;
+	size_t capacity;
+	size_t block_size;
+	size_t largest_free_area;
+	struct memrar_address_ranges allocated_list;
+	struct memrar_address_ranges free_list;
+};
+
+
 struct memrar_allocator *memrar_create_allocator(unsigned long base,
 						 size_t capacity,
 						 size_t block_size)
@@ -423,7 +453,33 @@ exit_memrar_free:
 	return 0;
 }
 
+size_t memrar_allocator_largest_free_area(struct memrar_allocator *allocator)
+{
+	if (allocator == NULL)
+		return 0;
+	return allocator->largest_free_area;
+}
+
+size_t memrar_allocator_capacity(struct memrar_allocator *allocator)
+{
+	if (allocator == NULL)
+		return 0;
+	return allocator->capacity;
+}
+
+void memrar_allocator_lock(struct memrar_allocator *allocator)
+{
+	if (allocator == NULL)
+		return;
+	mutex_lock(&allocator->lock);
+}
 
+void memrar_allocator_unlock(struct memrar_allocator *allocator)
+{
+	if (allocator == NULL)
+		return;
+	mutex_unlock(&allocator->lock);
+}
 
 /*
   Local Variables:
diff --git a/drivers/staging/memrar/memrar_allocator.h b/drivers/staging/memrar/memrar_allocator.h
index 0b80dea..0417072 100644
--- a/drivers/staging/memrar/memrar_allocator.h
+++ b/drivers/staging/memrar/memrar_allocator.h
@@ -50,34 +50,10 @@ struct memrar_address_ranges {
 	struct memrar_address_range range;
 };
 
-/**
- * struct memrar_allocator - encapsulation of the memory allocator state
- * @lock:		Lock used to synchronize access to the memory
- *			allocator state.
- * @base:		Base (start) address of the allocator memory
- *			space.
- * @capacity:		Size of the allocator memory space in bytes.
- * @block_size:		The size in bytes of individual blocks within
- *			the allocator memory space.
- * @largest_free_area:	Largest free area of memory in the allocator
- *			in bytes.
- * @allocated_list:	List of allocated memory block address
- *			ranges.
- * @free_list:		List of free address ranges.
- *
- * This structure contains all memory allocator state, including the
- * base address, capacity, free list, lock, etc.
- */
-struct memrar_allocator {
-/* private: internal use only */
-	struct mutex lock;
-	unsigned long base;
-	size_t capacity;
-	size_t block_size;
-	size_t largest_free_area;
-	struct memrar_address_ranges allocated_list;
-	struct memrar_address_ranges free_list;
-};
+
+/* Forward declaration */
+struct memrar_allocator;
+
 
 /**
  * memrar_create_allocator() - create a memory allocator
@@ -139,6 +115,40 @@ unsigned long memrar_allocator_alloc(struct memrar_allocator *allocator,
 long memrar_allocator_free(struct memrar_allocator *allocator,
 			   unsigned long address);
 
+/**
+ * memrar_allocator_largest_area() - largest free area of memory
+ * @allocator:  The allocator instance the free area is returned for.
+ *
+ * Return the largest free area of memory in the allocator in bytes.
+ */
+size_t memrar_allocator_largest_free_area(struct memrar_allocator *allocator);
+
+/**
+ * memrar_allocator_capacity - size of the allocator memory
+ * @allocator:  The allocator instance the capicity is returned for.
+ *
+ * Return the size of the allocator memory space in bytes.
+ */
+size_t memrar_allocator_capacity(struct memrar_allocator *allocator);
+
+
+/**
+ * memrar_allocator_lock - lock the allocator's mutex
+ * @allocator:  The allocator instance to lock the mutex for.
+ *
+ * Lock the mutex associated with the allocator.
+ */
+void memrar_allocator_lock(struct memrar_allocator *allocator);
+
+
+/**
+ * memrar_allocator_unlock - unlock the allocator's mutex
+ * @allocator:  The allocator instance to unlock the mutex for.
+ *
+ * Unlock the mutex associated with the allocator.
+ */
+void memrar_allocator_unlock(struct memrar_allocator *allocator);
+
 #endif  /* MEMRAR_ALLOCATOR_H */
 
 
diff --git a/drivers/staging/memrar/memrar_handler.c b/drivers/staging/memrar/memrar_handler.c
index efa7fd6..6a4628c 100644
--- a/drivers/staging/memrar/memrar_handler.c
+++ b/drivers/staging/memrar/memrar_handler.c
@@ -350,7 +350,8 @@ static int memrar_init_rar_resources(int rarnum, char const *devname)
 			devname, rarnum, (unsigned long) low, (unsigned long) high);
 
 	pr_info("%s: BRAR[%d] size = %zu KiB\n",
-			devname, rarnum, rar->allocator->capacity / 1024);
+			devname, rarnum,
+			memrar_allocator_capacity(rar->allocator) / 1024);
 
 	rar->allocated = 1;
 	return 0;
@@ -545,11 +546,11 @@ static long memrar_get_stat(struct RAR_stat *r)
 	 * Allocator capacity doesn't change over time.  No
 	 * need to synchronize.
 	 */
-	r->capacity = allocator->capacity;
+	r->capacity = memrar_allocator_capacity(allocator);
 
-	mutex_lock(&allocator->lock);
-	r->largest_block_size = allocator->largest_free_area;
-	mutex_unlock(&allocator->lock);
+	memrar_allocator_lock(allocator);
+	r->largest_block_size = memrar_allocator_largest_free_area(allocator);
+	memrar_allocator_unlock(allocator);
 	return 0;
 }
 
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

* RE: [PATCH] Staging: memrar: Moved memrar_allocator struct into memrar_allocator.c
  2010-06-14 12:40 [PATCH] Staging: memrar: Moved memrar_allocator struct into memrar_allocator.c Henri Häkkinen
@ 2010-06-23 17:51 ` Othman, Ossama
  2010-06-24  9:35   ` Fwd: " Henri Häkkinen
  2010-06-23 22:17 ` Greg KH
  1 sibling, 1 reply; 7+ messages in thread
From: Othman, Ossama @ 2010-06-23 17:51 UTC (permalink / raw)
  To: Henri Häkkinen, gregkh, randy.dunlap, alan; +Cc: devel, linux-kernel

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 1617 bytes --]

Hi,

> Forward declared memrar_allocator in memrar_allocator.h and moved it
> to memrar_allocator.c file.  Implemented memrar_allocator_capacity(),
> memrar_allocator_largest_free_area(), memrar_allocoator_lock() and
> memrar_allocator_unlock().
...
> -	mutex_lock(&allocator->lock);
> -	r->largest_block_size = allocator->largest_free_area;
> -	mutex_unlock(&allocator->lock);
> +	memrar_allocator_lock(allocator);
> +	r->largest_block_size =
> memrar_allocator_largest_free_area(allocator);
> +	memrar_allocator_unlock(allocator);

I don't think it's necessary to expose the allocator lock.  Why not just grab the lock in memrar_allocator_largest_free_area() while the underlying struct field is being accessed and then unlock it before that function returns?  That would allow the allocator lock to remain an internal implementation detail.  We only need to ensure access to the struct field itself is synchronized, e.g.:

size_t memrar_allocator_largest_free_area(struct memrar_allocator *allocator)
{
	size_t tmp = 0;

	if (allocator != NULL) {
		mutex_lock(&allocator->lock);
		tmp = allocator->largest_free_area;
		mutex_unlock(&allocator->lock);
	}

	return tmp;
}

Certainly the allocator->largest_free_area value could be updated after the lock is released and by the time it is returned to the user (for statistical purposes), but at least the internal allocator state would remain consistent in the presences of multiple threads.

HTH,
-Ossama

ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Staging: memrar: Moved memrar_allocator struct into memrar_allocator.c
  2010-06-14 12:40 [PATCH] Staging: memrar: Moved memrar_allocator struct into memrar_allocator.c Henri Häkkinen
  2010-06-23 17:51 ` Othman, Ossama
@ 2010-06-23 22:17 ` Greg KH
  1 sibling, 0 replies; 7+ messages in thread
From: Greg KH @ 2010-06-23 22:17 UTC (permalink / raw)
  To: Henri Häkkinen
  Cc: gregkh, ossama.othman, randy.dunlap, alan, devel, linux-kernel

On Mon, Jun 14, 2010 at 03:40:27PM +0300, Henri Häkkinen wrote:
> Forward declared memrar_allocator in memrar_allocator.h and moved it
> to memrar_allocator.c file.  Implemented memrar_allocator_capacity(),
> memrar_allocator_largest_free_area(), memrar_allocoator_lock() and
> memrar_allocator_unlock().

Shouldn't this be more than just one single patch?

Please only do one thing per patch.

Care to respin these and take into consideration the other comments for
this patch?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Fwd: [PATCH] Staging: memrar: Moved memrar_allocator struct into memrar_allocator.c
  2010-06-23 17:51 ` Othman, Ossama
@ 2010-06-24  9:35   ` Henri Häkkinen
  2010-06-24 17:46     ` Othman, Ossama
  0 siblings, 1 reply; 7+ messages in thread
From: Henri Häkkinen @ 2010-06-24  9:35 UTC (permalink / raw)
  To: Alan Cox
  Cc: gregkh, ossama.othman, Matti Lammi, randy.dunlap, devel, linux-kernel

On 24.6.2010, at 12.09, Alan Cox wrote:

>> size_t memrar_allocator_largest_free_area(struct memrar_allocator *allocator)
>> {
>> -	if (allocator == NULL)
>> -		return 0;
>> -	return allocator->largest_free_area;
>> +	size_t tmp = 0;
>> +
>> +	if (allocator != NULL) {
>> +		mutex_lock(&allocator->lock);
>> +		tmp = allocator->largest_free_area;
>> +		mutex_unlock(&allocator->lock);
> 
> This doesn't seem to make any sense (in either version). The moment you
> drop the lock the value in "tmp" becomes stale as the allocator could
> change it. ?
> 

The idea was proposed by Ossama Othman in his earlier reply.


Begin forwarded message:

> From: "Othman, Ossama" <ossama.othman@intel.com>
> To: Henri Häkkinen <henuxd@gmail.com>, "gregkh@suse.de" <gregkh@suse.de>, "randy.dunlap@oracle.com" <randy.dunlap@oracle.com>, "alan@linux.intel.com" <alan@linux.intel.com>
> Cc: "devel@driverdev.osuosl.org" <devel@driverdev.osuosl.org>, "linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
> Subject: RE: [PATCH] Staging: memrar: Moved memrar_allocator struct into memrar_allocator.c
> 
> Hi,
> 
>> Forward declared memrar_allocator in memrar_allocator.h and moved it
>> to memrar_allocator.c file.  Implemented memrar_allocator_capacity(),
>> memrar_allocator_largest_free_area(), memrar_allocoator_lock() and
>> memrar_allocator_unlock().
> ...
>> -	mutex_lock(&allocator->lock);
>> -	r->largest_block_size = allocator->largest_free_area;
>> -	mutex_unlock(&allocator->lock);
>> +	memrar_allocator_lock(allocator);
>> +	r->largest_block_size =
>> memrar_allocator_largest_free_area(allocator);
>> +	memrar_allocator_unlock(allocator);
> 
> I don't think it's necessary to expose the allocator lock.  Why not just grab the lock in memrar_allocator_largest_free_area() while the underlying struct field is being accessed and then unlock it before that function returns?  That would allow the allocator lock to remain an internal implementation detail.  We only need to ensure access to the struct field itself is synchronized, e.g.:
> 
> size_t memrar_allocator_largest_free_area(struct memrar_allocator *allocator)
> {
> 	size_t tmp = 0;
> 
> 	if (allocator != NULL) {
> 		mutex_lock(&allocator->lock);
> 		tmp = allocator->largest_free_area;
> 		mutex_unlock(&allocator->lock);
> 	}
> 
> 	return tmp;
> }
> 
> Certainly the allocator->largest_free_area value could be updated after the lock is released and by the time it is returned to the user (for statistical purposes), but at least the internal allocator state would remain consistent in the presences of multiple threads.
> 
> HTH,
> -Ossama
> 


^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [PATCH] Staging: memrar: Moved memrar_allocator struct into memrar_allocator.c
  2010-06-24  9:35   ` Fwd: " Henri Häkkinen
@ 2010-06-24 17:46     ` Othman, Ossama
  0 siblings, 0 replies; 7+ messages in thread
From: Othman, Ossama @ 2010-06-24 17:46 UTC (permalink / raw)
  To: Henri Häkkinen, Alan Cox
  Cc: gregkh, Matti Lammi, randy.dunlap, devel, linux-kernel

Hi,

> >> size_t memrar_allocator_largest_free_area(struct memrar_allocator
> *allocator)
> >> {
> >> -	if (allocator == NULL)
> >> -		return 0;
> >> -	return allocator->largest_free_area;
> >> +	size_t tmp = 0;
> >> +
> >> +	if (allocator != NULL) {
> >> +		mutex_lock(&allocator->lock);
> >> +		tmp = allocator->largest_free_area;
> >> +		mutex_unlock(&allocator->lock);
> >
> > This doesn't seem to make any sense (in either version). The moment
> you
> > drop the lock the value in "tmp" becomes stale as the allocator could
> > change it. ?
> >
> 
> The idea was proposed by Ossama Othman in his earlier reply.

:-) 

[OO] > > Certainly the allocator->largest_free_area value could be updated
> after the lock is released and by the time it is returned to the user
> (for statistical purposes), but at least the internal allocator state
> would remain consistent in the presences of multiple threads.

My suggestion focused solely on hiding the allocator lock from the caller.  The TOCTOU race I alluded to above exists in the current version of the code, and was not introduced with the change I proposed to your patch.

HTH,
-Ossama

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Staging: memrar: Moved memrar_allocator struct into memrar_allocator.c
  2010-06-14 11:54 Henri Häkkinen
@ 2010-06-22 22:00 ` Greg KH
  0 siblings, 0 replies; 7+ messages in thread
From: Greg KH @ 2010-06-22 22:00 UTC (permalink / raw)
  To: Henri Häkkinen; +Cc: gregkh, ossama.othman, devel, linux-kernel

On Mon, Jun 14, 2010 at 02:54:33PM +0300, Henri Häkkinen wrote:
> Forward declared memrar_allocator in memrar_allocator.h and moved it
> to memrar_allocator.c file.  Implemented memrar_allocator_capacity() and
> memrar_allocator_largest_free_area().

Um, did you try building the code after this patch?  It fails in bad
ways:

  CC [M]  drivers/staging/memrar/memrar_handler.o
drivers/staging/memrar/memrar_handler.c: In function ‘memrar_init_rar_resources’:
drivers/staging/memrar/memrar_handler.c:352:2: error: dereferencing pointer to incomplete type
drivers/staging/memrar/memrar_handler.c: In function ‘memrar_get_stat’:
drivers/staging/memrar/memrar_handler.c:548:25: error: dereferencing pointer to incomplete type
drivers/staging/memrar/memrar_handler.c:550:23: error: dereferencing pointer to incomplete type
drivers/staging/memrar/memrar_handler.c:551:35: error: dereferencing pointer to incomplete type
drivers/staging/memrar/memrar_handler.c:552:25: error: dereferencing pointer to incomplete type

Please always build the patches you send out.  I can't take
this one obviously :(

Care to fix it up?

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH] Staging: memrar: Moved memrar_allocator struct into memrar_allocator.c
@ 2010-06-14 11:54 Henri Häkkinen
  2010-06-22 22:00 ` Greg KH
  0 siblings, 1 reply; 7+ messages in thread
From: Henri Häkkinen @ 2010-06-14 11:54 UTC (permalink / raw)
  To: gregkh, ossama.othman, henuxd; +Cc: devel, linux-kernel

Forward declared memrar_allocator in memrar_allocator.h and moved it
to memrar_allocator.c file.  Implemented memrar_allocator_capacity() and
memrar_allocator_largest_free_area().

Signed-off-by: Henri Häkkinen <henuxd@gmail.com>
---
 drivers/staging/memrar/memrar_allocator.c |   42 +++++++++++++++++++++++++
 drivers/staging/memrar/memrar_allocator.h |   48 ++++++++++++-----------------
 2 files changed, 62 insertions(+), 28 deletions(-)

diff --git a/drivers/staging/memrar/memrar_allocator.c b/drivers/staging/memrar/memrar_allocator.c
index a4f8c58..00703c2 100644
--- a/drivers/staging/memrar/memrar_allocator.c
+++ b/drivers/staging/memrar/memrar_allocator.c
@@ -41,6 +41,36 @@
 #include <linux/kernel.h>
 
 
+/**
+ * struct memrar_allocator - encapsulation of the memory allocator state
+ * @lock:		Lock used to synchronize access to the memory
+ *			allocator state.
+ * @base:		Base (start) address of the allocator memory
+ *			space.
+ * @capacity:		Size of the allocator memory space in bytes.
+ * @block_size:		The size in bytes of individual blocks within
+ *			the allocator memory space.
+ * @largest_free_area:	Largest free area of memory in the allocator
+ *			in bytes.
+ * @allocated_list:	List of allocated memory block address
+ *			ranges.
+ * @free_list:		List of free address ranges.
+ *
+ * This structure contains all memory allocator state, including the
+ * base address, capacity, free list, lock, etc.
+ */
+struct memrar_allocator {
+/* private: internal use only */
+	struct mutex lock;
+	unsigned long base;
+	size_t capacity;
+	size_t block_size;
+	size_t largest_free_area;
+	struct memrar_address_ranges allocated_list;
+	struct memrar_address_ranges free_list;
+};
+
+
 struct memrar_allocator *memrar_create_allocator(unsigned long base,
 						 size_t capacity,
 						 size_t block_size)
@@ -423,7 +453,19 @@ exit_memrar_free:
 	return 0;
 }
 
+size_t memrar_allocator_largest_free_area(struct memrar_allocator *allocator)
+{
+	if (allocator == NULL)
+		return 0;
+	return allocator->largest_free_area;
+}
 
+size_t memrar_allocator_capacity(struct memrar_allocator *allocator)
+{
+	if (allocator == NULL)
+		return 0;
+	return allocator->capacity;
+}
 
 /*
   Local Variables:
diff --git a/drivers/staging/memrar/memrar_allocator.h b/drivers/staging/memrar/memrar_allocator.h
index 0b80dea..1e6cab0 100644
--- a/drivers/staging/memrar/memrar_allocator.h
+++ b/drivers/staging/memrar/memrar_allocator.h
@@ -50,34 +50,10 @@ struct memrar_address_ranges {
 	struct memrar_address_range range;
 };
 
-/**
- * struct memrar_allocator - encapsulation of the memory allocator state
- * @lock:		Lock used to synchronize access to the memory
- *			allocator state.
- * @base:		Base (start) address of the allocator memory
- *			space.
- * @capacity:		Size of the allocator memory space in bytes.
- * @block_size:		The size in bytes of individual blocks within
- *			the allocator memory space.
- * @largest_free_area:	Largest free area of memory in the allocator
- *			in bytes.
- * @allocated_list:	List of allocated memory block address
- *			ranges.
- * @free_list:		List of free address ranges.
- *
- * This structure contains all memory allocator state, including the
- * base address, capacity, free list, lock, etc.
- */
-struct memrar_allocator {
-/* private: internal use only */
-	struct mutex lock;
-	unsigned long base;
-	size_t capacity;
-	size_t block_size;
-	size_t largest_free_area;
-	struct memrar_address_ranges allocated_list;
-	struct memrar_address_ranges free_list;
-};
+
+/* Forward declaration */
+struct memrar_allocator;
+
 
 /**
  * memrar_create_allocator() - create a memory allocator
@@ -139,6 +115,22 @@ unsigned long memrar_allocator_alloc(struct memrar_allocator *allocator,
 long memrar_allocator_free(struct memrar_allocator *allocator,
 			   unsigned long address);
 
+/**
+ * memrar_allocator_largest_area() - largest free area of memory
+ * @allocator:  The allocator instance the free area is returned for.
+ *
+ * Return the largest free area of memory in the allocator in bytes.
+ */
+size_t memrar_allocator_largest_free_area(struct memrar_allocator *allocator);
+
+/**
+ * memrar_allocator_capacity - size of the allocator memory
+ * @allocator:  The allocator instance the capicity is returned for.
+ *
+ * Return the size of the allocator memory space in bytes.
+ */
+size_t memrar_allocator_capacity(struct memrar_allocator *capacity);
+
 #endif  /* MEMRAR_ALLOCATOR_H */
 
 
-- 
1.7.1


^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2010-06-24 17:46 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-06-14 12:40 [PATCH] Staging: memrar: Moved memrar_allocator struct into memrar_allocator.c Henri Häkkinen
2010-06-23 17:51 ` Othman, Ossama
2010-06-24  9:35   ` Fwd: " Henri Häkkinen
2010-06-24 17:46     ` Othman, Ossama
2010-06-23 22:17 ` Greg KH
  -- strict thread matches above, loose matches on Subject: below --
2010-06-14 11:54 Henri Häkkinen
2010-06-22 22:00 ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).